Impossible de désérialiser le tableau JSON (par exemple [1,2,3]) dans le type '' car le type nécessite un objet JSON (par exemple {“name”: “value”}) pour désérialiser correctement


99

J'ai ce 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"
    }
]

Et j'ai ces classes:

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

J'essaye de désérialiser le JSON ci-dessus en utilisant le code ci-dessous:

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

mais j'obtiens cette erreur:

Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type 'test.Model.RetrieveMultipleResponse' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement. Pour corriger cette erreur, modifiez le JSON en objet JSON (par exemple {"name": "value"}) ou changez le type désérialisé en un tableau ou un type qui implémente une interface de collection (par exemple ICollection, IList) comme List qui peut être désérialisé d'un tableau JSON. JsonArrayAttribute peut également être ajouté au type pour le forcer à se désérialiser d'un tableau JSON. Chemin '', ligne 1, position 1.

Réponses:


160

Votre chaîne json est entourée de crochets ( []), elle est donc interprétée comme un tableau au lieu d'un RetrieveMultipleResponseobjet unique . Par conséquent, vous devez le désérialiser pour le type collection de RetrieveMultipleResponse, par exemple:

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

J'ai dû supprimer "//" avant "[", puis cela a fonctionné pour moi. merci
criard

1
Si vous vouliez le conserver en tant qu'objet unique au lieu d'une collection, pourriez-vous simplement faire JsonStr.Replace ("[", ""). Replace ("]", "") ou ne serait-ce pas une bonne pratique?
Riche

Pour info, cela n'a pas fonctionné pour moi parce que j'obtenais mon JSON à partir d'une API et que l'URL était erronée pendant une journée entière. > <
w00ngy

1
Qu'est-ce que RetrieveMultipleResponse ici?
Freakishly

Merci, cela a fonctionné pour moi var objResponse1 = JsonConvert.DeserializeObject <List <QuestionData>> (srt); // myWord = myQuestionData.Word; Debug.Log ("myWord" + objResponse1 [0] .Word);
StackBuddy

10

Si l'on veut supporter les génériques (dans une méthode d'extension) c'est le modèle ...

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

Il est utilisé comme ceci:

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

MyClassType ressemble à ceci (doit correspondre aux paires nom-valeur du tableau 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; }
 }

Utilisez NUGET pour télécharger Newtonsoft.Json, ajoutez une référence si nécessaire ...

using Newtonsoft.Json;



0

Utilisez ceci, FrontDataest une chaîne JSON:

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

et extraire la liste:

var a = objResponse1[0];
var b = a.CustomerData;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.