Deserializzazione dell’array JSON in object .NET fortemente tipizzato

Quando posso chiamare l’API di terze parti e recuperare un valore di una singola class di dati, tutto si deserializza bene usando questo codice

TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser 

Il problema si presenta quando provo a deserializzare il contenuto della risposta JSON che è un array, come ad esempio

 { "data": [ { "name": "A Jones", "id": "500015763" }, { "name": "B Smith", "id": "504986213" }, { "name": "C Brown", "id": "509034361" } ] } 

Posso solo far funzionare la serializzazione se utilizzo una class di wrapping personalizzata attorno al membro “data” e quel membro deve essere di tipo List . Se li ha come tipo List Ottengo ArgumentException dal metodo JsonParser DesializeType .

Inizialmente ho provato a serializzare senza un tipo di avvolgimento come questo

 List freinds = jsonSerializer.Deserialize(response, typeof(List)) as List; 

ma questo mi restituisce solo una collezione vuota. Sicuramente devo essere in grado di far deserializzare l’array in una lista fortemente tipizzata.

Osservando la fonte , per WP7 Hammock in realtà non usa Json.Net per l’analisi di JSON. Invece usa il proprio parser che non affronta molto bene i tipi personalizzati.

Se si utilizza direttamente Json.Net è ansible deserializzare in una raccolta fortemente tipizzata all’interno di un object wrapper.

 var response = @" { ""data"": [ { ""name"": ""A Jones"", ""id"": ""500015763"" }, { ""name"": ""B Smith"", ""id"": ""504986213"" }, { ""name"": ""C Brown"", ""id"": ""509034361"" } ] } "; var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass)); return des.data.Count.ToString(); 

e con:

 public class MyClass { public List data { get; set; } } public class User { public string name { get; set; } public string id { get; set; } } 

Dovendo creare l’object extra con la proprietà data è fastidioso, ma questa è una conseguenza del modo in cui è costruito l’object formattato JSON.

Documentazione: serializzazione e deserializzazione JSON

provare

 List friends = jsonSerializer.Deserialize>(response); 

Questa soluzione sembra funzionare per me e va in giro a dover codificare un gruppo di classi con “Dati” al loro interno.

 public interface IDataResponse where T : class { List Data { get; set; } } public class DataResponse : IDataResponse where T : class { [JsonProperty("data")] public List Data { get; set; } } 

Dovrei averlo incluso per cominciare, ecco un metodo di esempio che usa quanto sopra:

 public List GetUser() { var results = GetUserJson(); var userList = JsonConvert.DeserializeObject>(results.ToString()); return userList.Data.ToList(); } 

Questo ha funzionato per me per la deserializzazione di JSON in una serie di oggetti:

 List friends = JsonConvert.DeserializeObject>(response); 

Json.NET – Documentazione

http://james.newtonking.com/json/help/index.html?topic=html/SelectToken.htm

Interpretazione per l’autore

 var o = JObject.Parse(response); var a = o.SelectToken("data").Select(jt => jt.ToObject()).ToList(); 

Pat, la struttura Json sembra molto familiare a un problema che ho descritto qui – La risposta per me era trattare la rappresentazione JSON come un dizionario , anche se c’era solo una voce.

Se sono corretto, la tua chiave è di tipo stringa e il valore di una lista dove T rappresenta la class ‘TheUser’

HTH

PS: se vuoi una migliore serializzazione perf check utilizzando Silverlight Serializer , dovrai creare una versione WP7, plug Shameless – Ho scritto un post sul blog su questo

Sospetto che il problema sia dovuto al fatto che JSON rappresenta un object con l’elenco di utenti come una proprietà. Prova a deserializzare qualcosa come:

 public class UsersResponse { public List Data { get; set; } }