2014-05-06 16 views
10

Mam obiekt JSON, który zawiera długą listę kodów obszarów. Niestety każdy kod obszaru jest nazwą obiektu na liście w obiekcie Data. Jak utworzyć klasę, która pozwoli RestSharp na deserializację treści?Deserializuj JSON z obiektami dynamicznymi

Oto jak moja klasa wygląda teraz:

public class phaxioResponse 
{ 
    public string success { get; set; } 
    public string message { get; set; } 
    public List<areaCode> data { get; set; } 

    public class areaCode 
    { 
     public string city { get; set; } 
     public string state { get; set; } 
    } 
} 

A oto treść JSON:

{ 
    success: true 
    message: "277 area codes available." 
    data: { 
     201: { 
      city: "Bayonne, Jersey City, Union City" 
      state: "New Jersey" 
     } 
     202: { 
      city: "Washington" 
     state: "District Of Columbia" 
     } [...] 
} 
+2

To JSON jest wszelkiego rodzaju sfaulował w górę. –

+0

Czy naprawdę oczekujesz, że ktoś to przeczyta? –

+1

@JohnSaunders nie musisz czytać całego obiektu json - jestem prawie pewien, że widzisz, że w głównym obiekcie są tylko trzy węzły, a obiekt danych jest taki sam przez cały czas? – PeteFox

Odpowiedz

17

Ponieważ ten JSON nie jest C# przyjazny, Musiałem zrobić trochę hackery, aby to wyjść poprawnie. Jednak wynik jest całkiem niezły.

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson); 
var data = ((JObject)json.data).Children(); 
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] }); 

Ten kod wygeneruje typ anonimowy najlepiej odzwierciedlający dane. Jednak anonimowy typ może być łatwo zastąpiony przez ctor dla bardziej normalnej klasy DTO.

Wyjście wygląda mniej więcej tak:

Deserialization Output

+0

Czy możesz wyjaśnić, co to jest * data * w * json.data *? Dziękuję –

+0

@HappyBird, pochodzi z przykładu JSON opublikowanego w pytaniu. –

0

Nie wiem nic o RestSharp wiem, ale jeśli używasz Newtonsoft na serwerze po stronie, możesz po prostu przekazać JObject do swojej metody. Następnie możesz przeskanować obiekt, aby zobaczyć, jaki typ obiektu faktycznie jest i użyć JObject.ToObject(), aby go przekonwertować.

3

Twój json jest nieprawidłowy, ale jeśli nie naprawić go można użyć narzędzia json-to-CSharp jak ten na http://json2csharp.com/ aby wygenerować klasy:

public class __invalid_type__201 
{ 
    public string city { get; set; } 
    public string state { get; set; } 
} 

public class Data 
{ 
    public __invalid_type__201 __invalid_name__201 { get; set; } 
} 

public class RootObject 
{ 
    public bool success { get; set; } 
    public string message { get; set; } 
    public Data data { get; set; } 
} 
+1

To świetny pomysł ... Niestety JSON nie jest w moich rękach - pochodzi z zewnętrznego API – PeteFox

+1

@PeteFox nie jest prawidłowy JSON. Wszystkie nazwy pól powinny być w cudzysłowie, aby uznać je za prawidłowy JSON. Dlatego json2csharp.com generuje nieprawidłowe klasy. –

Powiązane problemy