2012-01-05 15 views
5

Mam następujący JSON wyrażenie: (.. Jak można zauważyć, niestety mam coś w rodzaju „root” element dla każdego obiektu w tablicy bez tej „root” element zadanie staje się dość trywialne)Jak deserializować macierz JSON z elementem "root" dla każdego obiektu w tablicy przy użyciu Json.NET?

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

muszę deserializować go do listy Person klasy:

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

Czy można zrobić z Json.NET bez tworzenia klasy otoki jak PersonResult?

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

Idealne rozwiązanie dla mnie jest to, aby być w stanie jakoś jednoznacznie określić to „root” (na przykład za pomocą atrybutu) i nie tworzy żadnych owijarki, pomocnicy itp

Odpowiedz

4

Niestety, nie ma wiele można zrób o tym problemie. Tak wygląda format JSON i nie da się tego obejść. W rezultacie, Json.Net „widzi” swój ciąg jako bardziej lub mniej:

tablicą obiektów z Person własności, co jest kolejnym obiektem z Name i Gender właściwości

Mogłabyś być może zagrać trochę z niestandardowym ContractResolvers, aby zmusić serializator do pracy w inny sposób ... ale to trochę pracy. Klasa wrapperów, tak jak sugerowałeś, to sposób radzenia sobie z tymi problemami i sugeruję trzymanie się jej.

+0

Tak, niestety musiałem skończyć z podejściem opakowania. Dzięki. –

Powiązane problemy