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.
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);
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;
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é