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.

Avinash
la source

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);
har07
la source
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;
John Peters
la source
4

Je ne peux pas ajouter de commentaire à la solution mais cela n'a pas fonctionné pour moi. La solution qui a fonctionné pour moi a été d'utiliser:

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); 
return des.data.Count.ToString();

Désérialisation du tableau JSON en objet .NET fortement typé

TheNerdyNerd
la source
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;
udorb b
la source