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.