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.

Avinash
quelle

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);
har07
quelle
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;
John Peters
quelle
0
var objResponse1 = 
JsonConvert.DeserializeObject<List<RetrieveMultipleResponse>>(JsonStr);

hat funktioniert!

Mai Dias
quelle