型は正しく逆シリアル化するためにJSONオブジェクト(たとえば、{“ name”:“ value”})を必要とするため、JSON配列(たとえば[1,2,3])を型 ''に逆シリアル化できません


99

私はこの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'に逆シリアル化できません。型が正しく逆シリアル化するにはJSONオブジェクト(例:{"name": "value"})が必要なためです。このエラーを修正するには、JSONをJSONオブジェクト(例:{"name": "value"})に変更するか、デシリアライズされたタイプを配列またはListのようなコレクションインターフェイス(例:ICollection、IList)を実装するタイプに変更します。 JSON配列から逆シリアル化されます。JsonArrayAttributeを型に追加して、JSON配列から強制的に逆シリアル化することもできます。パス ''、行1、位置1。

回答:


160

json文字列は角括弧([])で囲まれているため、単一のRetrieveMultipleResponseオブジェクトではなく配列として解釈されます。したがって、RetrieveMultipleResponseたとえば次のようにコレクションを入力するには、逆シリアル化する必要があります。

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

「[」の前に「//」を削除する必要がありましたが、それでうまくいきました。感謝
2017

1
コレクションではなく単一のオブジェクトとして保持したい場合は、JsonStr.Replace( "["、 "")。Replace( "]"、 "")を実行できますか、またはこれは良い方法ではありませんか?
リッチ

ちなみに、APIからJSONを取得していて、1日中異常なURLが間違っていたため、これはうまくいきませんでした。> <
w00ngy 2018年

1
ここでRetrieveMultipleResponseとは何ですか?
2018

これは私のために働いてくれてありがとうvar objResponse1 = JsonConvert.DeserializeObject <List <QuestionData >>(srt); // myWord = myQuestionData.Word; Debug.Log( "myWord" + objResponse1 [0] .Word);
StackBuddy

10

(拡張メソッドで)Genericsをサポートしたい場合、これはパターンです...

public  static List<T> Deserialize<T>(this string SerializedJSONString)
{
    var stuff = JsonConvert.DeserializeObject<List<T>>(SerializedJSONString);
    return stuff;
}

これは次のように使用されます。

var rc = new MyHttpClient(URL);
//This response is the JSON Array (see posts above)
var response = rc.SendRequest();
var data = response.Deserialize<MyClassType>();

MyClassTypeは次のようになります(JSON配列の名前と値のペアと一致する必要があります)

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
 public class MyClassType
 {
    [JsonProperty(PropertyName = "Id")]
    public string Id { get; set; }

    [JsonProperty(PropertyName = "Name")]
    public string Name { get; set; }

    [JsonProperty(PropertyName = "Description")]
    public string Description { get; set; }

    [JsonProperty(PropertyName = "Manager")]
    public string Manager { get; set; }

    [JsonProperty(PropertyName = "LastUpdate")]
    public DateTime LastUpdate { get; set; }
 }

NUGETを使用してNewtonsoft.Jsonをダウンロードし、必要に応じて参照を追加します...

using Newtonsoft.Json;



0

これを使用して、FrontDataJSON文字列です。

var objResponse1 = JsonConvert.DeserializeObject<List<DataTransfer>>(FrontData);  

そして抽出リスト:

var a = objResponse1[0];
var b = a.CustomerData;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.