Das JSON-Array (z. B. [1,2,3]) kann nicht in den Typ '' deserialisiert werden, da für den Typ ein JSON-Objekt (z. B. {“name”: “value”}) erforderlich ist, um die Deserialisierung korrekt durchzuführen


98

Ich habe diesen 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"
    }
]

Und ich habe diese Klassen:

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; }
}

Ich versuche, den obigen JSON mit dem folgenden Code zu deserialisieren:

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

aber ich bekomme diesen Fehler:

Das aktuelle JSON-Array (z. B. [1,2,3]) kann nicht in den Typ 'test.Model.RetrieveMultipleResponse' deserialisiert werden, da für den Typ ein JSON-Objekt (z. B. {"name": "value"}) erforderlich ist, um die Deserialisierung korrekt durchzuführen. Um diesen Fehler zu beheben, ändern Sie entweder den JSON in ein JSON-Objekt (z. B. {"name": "value"}) oder den deserialisierten Typ in ein Array oder einen Typ, der eine Auflistungsschnittstelle (z. B. ICollection, IList) wie List implementiert von einem JSON-Array deserialisiert werden. JsonArrayAttribute kann dem Typ auch hinzugefügt werden, um die Deserialisierung von einem JSON-Array zu erzwingen. Pfad '', Zeile 1, Position 1.

Antworten:


159

Ihre JSON-Zeichenfolge wird in eckige Klammern ( []) eingeschlossen und daher als Array anstelle eines einzelnen RetrieveMultipleResponseObjekts interpretiert . Daher müssen Sie es deserialisieren, um eine Sammlung von RetrieveMultipleResponsebeispielsweise zu geben:

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

Ich musste "//" vor "[" entfernen, dann funktionierte es für mich. danke
— grell

1
Wenn Sie es als einzelnes Objekt anstelle einer Sammlung behalten möchten, können Sie einfach JsonStr.Replace ("[", ""). Replace ("]", "") ausführen oder wäre dies keine gute Vorgehensweise?
— Rich

Zu Ihrer Information, das hat bei mir nicht funktioniert, weil ich meinen JSON von einer API erhalten habe und die verdammte URL einen ganzen Tag lang falsch war. > <
— w00ngy

1
Was ist RetrieveMultipleResponse hier?
— Freakishly

Vielen Dank, dass dies für mich funktioniert hat. Var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
— StackBuddy

10

Wenn man Generics (in einer Erweiterungsmethode) unterstützen möchte, ist dies das Muster ...

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

Es wird so verwendet:

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

MyClassType sieht folgendermaßen aus (muss mit Name-Wert-Paaren des JSON-Arrays übereinstimmen)

[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; }
 }

Verwenden Sie NUGET, um Newtonsoft.Json herunterzuladen. Fügen Sie bei Bedarf eine Referenz hinzu ...

using Newtonsoft.Json;


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

hat funktioniert!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.