1. ホーム
  2. c#

[解決済み] JSON配列(例: [1,2,3])をtype ' ' にデシリアライズできない。typeはJSONオブジェクト(例: {"name": "value"}) を必要とするので、正しくデシリアライズされない。

2022-06-29 15:13:42

質問

このようなJSONがあります。

[
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 1",
                    "Values": [
                        "Acc 1"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "1",
                    "Values": [
                        "1"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "1"
    },
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 2",
                    "Values": [
                        "Acc 2"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "2",
                    "Values": [
                        "2"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "2"
    },
    {
        "Attributes": [
            {
                "Key": "Name",
                "Value": {
                    "Value": "Acc 3",
                    "Values": [
                        "Acc 3"
                    ]
                }
            },
            {
                "Key": "Id",
                "Value": {
                    "Value": "3",
                    "Values": [
                        "3"
                    ]
                }
            }
        ],
        "Name": "account",
        "Id": "2"
    }
]

そして、こんなクラスがあります。

public class RetrieveMultipleResponse
{
    public List<Attribute> Attributes { get; set; }
    public string Name { get; set; }
    public string Id { get; set; }
}

public class Value
{
    [JsonProperty("Value")]
    public string value { get; set; }
    public List<string> Values { get; set; }
}

public class Attribute
{
    public string Key { get; set; }
    public Value Value { get; set; }
}

上記のJSONを以下のようなコードでデシリアライズしようとしています。

var objResponse1 = JsonConvert.DeserializeObject<RetrieveMultipleResponse>(JsonStr);

と入力しても、このようなエラーが発生します。

現在の JSON 配列 (例: [1,2,3]) をタイプ test.Model.RetrieveMultipleResponse' にデシリアライズできません。 オブジェクト (例: {"name":"value"}) を必要とするため、正しくデシリアライズされません。このエラーを修正するには エラーを修正するには、JSONをJSONオブジェクトに変更するか(例:{"name":"value"})、デシリアライズされた型を変更します。 または、デシリアライズされた型を、配列またはコレクション・インターフェースを実装した型に変更する のようなコレクション・インターフェース(ICollection, IListなど)を実装した型に変更する。 のようなコレクションインターフェース(ICollection, IList)を実装した型に変更します。JsonArrayAttributeを追加することもできます。 を追加して、JSON 配列からのデシリアライズを強制させることもできます。パス '', 1行目, 1の位置です。

どのように解決するのですか?

jsonの文字列は角括弧で囲まれています( [] ) で囲まれているため、単一の RetrieveMultipleResponse オブジェクトではなく、配列と解釈されます。したがって、これをデシリアライズして RetrieveMultipleResponse のコレクションにデシリアライズする必要があります。

var objResponse1 = 
    JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);