私が使用している JSON API の 1 つは、クエリから返される結果の数に応じてデータ構造が異なる応答を返します。私は C# からそれを消費し、JSON.NET を使用して応答を逆シリアル化しています。
API から返される JSON は次のとおりです。
複数の結果応答:
{
"response": {
"result": {
"Leads": {
"row": [
{
"no": "1",
...
...
...
単一の結果応答:
{
"response": {
"result": {
"Leads": {
"row": {
"no": "1",
...
...
...
複数の結果の場合は配列であり、単一の結果の場合はオブジェクトである「行」ノードの違いに注意してください。
このデータを逆シリアル化するために使用するクラスは次のとおりです
クラス:
public class ZohoLeadResponseRootJson
{
public ZohoLeadResponseJson Response { get; set; }
}
public class ZohoLeadResponseJson
{
public ZohoLeadResultJson Result { get; set; }
}
public class ZohoLeadResultJson
{
public ZohoDataMultiRowJson Leads { get; set; }
}
public class ZohoDataMultiRowJson
{
public List<ZohoDataRowJson> Row { get; set; }
}
public class ZohoDataRowJson
{
public int No { get; set; }
...
}
「Multiple Result Response」は問題なくデシリアライズできますが、レスポンスの結果が1つしかない場合、データ構造の変更によりレスポンスをデシリアライズできません。例外が発生します
Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON
object (e.g. {"name":"value"}) into type
'System.Collections.Generic.List`1[MyNamespace.ZohoDataRowJson]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3])
or change the deserialized type so that it is a normal .NET type (e.g. not a
primitive type like integer, not a collection type like an array or List<T>)
that can be deserialized from a JSON object. JsonObjectAttribute can also be
added to the type to force it to deserialize from a JSON object.
Path 'response.result.Notes.row.no', line 1, position 44.
Json.Net でこれを処理する方法はありますか?