2012-01-05 11 views
5

Ho seguito JSON stringa: (.. Come si può notare, purtroppo, ho una sorta di elemento "root" per ogni oggetto nella matrice Senza questo elemento "root" il compito diventa abbastanza banale)Come deserializzare l'array JSON con l'elemento "root" per ogni oggetto nell'array usando Json.NET?

[ 
    { "Person" : { "Name" : "John", "Gender" : "male" } }, 
    { "Person" : { "Name" : "John", "Gender" : "male" } } 
] 

devo deserializzare in un elenco di Person classe:

class Person { 
    public string Name { get; set; } 
    public string Gender { get; set; } 
} 
... 
List<Person> ListPersons() { 
    return JsonConvert.DeserializeObject<List<Person>>(jsonString); 
} 

E 'possibile fare con Json.NET senza creare classe wrapper come PersonResult?

class PersonResult { 
    public Person Person { get; set; } 
} 
... 
List<Person> ListPersons() { 
    return JsonConvert.DeserializeObject<List<PersonResult>>(jsonString) 
         .Select(p => p.Person) 
         .ToList(); 
} 

La soluzione perfetta per me è quello di essere in grado in qualche modo esplicitamente specificare questa "root" (ad esempio tramite l'attributo) e non crea alcun wrapper, aiutanti, ecc

risposta

4

Purtroppo, non c'è molto che si possa fare su questo problema. Ecco come appare il formato JSON e non c'è modo di aggirarlo. Di conseguenza, Json.Net "vede" la stringa come più o meno:

un array di oggetti con Person proprietà, che è un altro oggetto con Name e Gender proprietà

Si potrebbe possibilmente giocare un po 'con lo standard ContractResolvers per forzare il serializzatore a funzionare in modo diverso ... ma è un bel po' di lavoro. La classe Wrapper come hai suggerito è come vengono affrontati questi problemi e suggerisco di attenervisi.

+0

Sì, purtroppo ho dovuto finire con l'approccio wrapper. Grazie. –

Problemi correlati