Impossibile deserializzare l'array JSON (ad es. [1,2,3]) nel tipo "" perché il tipo richiede un oggetto JSON (ad es. {"Name": "value"}) per deserializzare correttamente


99

Ho questo 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"
    }
]

E ho queste classi:

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

Sto cercando di deserializzare il JSON sopra utilizzando il codice seguente:

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

ma ricevo questo errore:

Impossibile deserializzare l'array JSON corrente (ad es. [1,2,3]) nel tipo 'test.Model.RetrieveMultipleResponse' perché il tipo richiede un oggetto JSON (ad es. {"Name": "value"}) per deserializzare correttamente. Per correggere questo errore, modificare il JSON in un oggetto JSON (ad esempio {"name": "value"}) o modificare il tipo deserializzato in un array o un tipo che implementa un'interfaccia di raccolta (ad esempio ICollection, IList) come List che può essere deserializzato da un array JSON. JsonArrayAttribute può anche essere aggiunto al tipo per forzarne la deserializzazione da una matrice JSON. Path '', riga 1, posizione 1.

Risposte:


160

La tua stringa json è racchiusa tra parentesi quadre ( []), quindi viene interpretata come array anziché come singolo RetrieveMultipleResponseoggetto. Pertanto, è necessario deserializzarlo per digitare la raccolta di RetrieveMultipleResponse, ad esempio:

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

Ho dovuto rimuovere "//" prima di "[", quindi ha funzionato per me. grazie
sgargiante

1
Se volessi mantenerlo come un singolo oggetto invece che come una raccolta, potresti semplicemente fare JsonStr.Replace ("[", ""). Replace ("]", "") o non sarebbe una buona pratica?
Rich

Cordiali saluti, questo non ha funzionato per me perché stavo ottenendo il mio JSON da un'API e ho avuto l'URL impazzito sbagliato per un intero giorno. > <
w00ngy

1
Che cos'è RetrieveMultipleResponse qui?
Freakishly

Grazie, questo ha funzionato per me var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Se si vuole supportare i Generics (in un metodo di estensione) questo è il modello ...

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

È usato in questo modo:

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

MyClassType ha questo aspetto (deve corrispondere a coppie di valori nome dell'array 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; }
 }

Usa NUGET per scaricare Newtonsoft.Json aggiungi un riferimento dove necessario ...

using Newtonsoft.Json;



0

Usa questo, FrontDataè una stringa JSON:

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

ed estrai l'elenco:

var a = objResponse1[0];
var b = a.CustomerData;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.