web-dev-qa-db-fra.com

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

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 cours:

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'essaie de désérialiser le JSON ci-dessus à l'aide du 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 ce type nécessite un objet JSON (par exemple {"name": "value"}) pour se désérialiser correctement. Pour corriger cette erreur, remplacez le JSON par un objet JSON (par exemple, {"name": "value"}) ou modifiez le type désérialisé par un tableau ou un type implémentant une interface de collection (par exemple, ICollection, IList), comme List être désérialisé à partir d'un tableau JSON. JsonArrayAttribute peut également être ajouté au type pour le forcer à se désérialiser à partir d'un tableau JSON. Chemin '', ligne 1, position 1.

71
Avinash

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

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

Si on veut supporter Generics (dans une méthode d'extension), c'est le motif ...

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;
8
John Peters

Impossible d'ajouter un 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 d'un tableau JSON en objet .NET fortement typé

4
TheNerdyNerd