2014-11-08 21 views
15

Staram się korzystać z usługi Northwind OData:Jak deserializować oData JSON?

http://services.odata.org/V3/OData/OData.svc/Products?$format=json

i deserializować go do kolekcji produktów:

using (var client = new HttpClient()) 
    { 
     HttpResponseMessage response = await client.GetAsync(new Uri(url)); 
     ObservableCollection<Product> products = await response.Content.ReadAsAsync<ObservableCollection<Product>>(); 
    } 

Ale serializer wydaje się nie podoba odata.metadata część i fakt, że istnieją tam 2 odata.type zapisy (nie jestem pewien, co to jest).

Czy istnieje prosty sposób na zrobienie tego?

Odpowiedz

25

Korzystanie Json.Net

using (var client = new HttpClient()) 
{ 
    var json = await client.GetStringAsync("http://services.odata.org/V3/OData/OData.svc/Products?$format=json"); 
    var odata = JsonConvert.DeserializeObject<OData>(json); 
} 

public class Value 
{ 
    [JsonProperty("odata.type")] 
    public string Type { set; get; } 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public DateTime? DiscontinuedDate { get; set; } 
    public int Rating { get; set; } 
    public double Price { get; set; } 
} 

public class OData 
{ 
    [JsonProperty("odata.metadata")] 
    public string Metadata { get; set; } 
    public List<Value> Value { get; set; } 
} 
+1

To działa prawidłowo. Dziękuję bardzo! – Graeme

+0

BTW, czy wszystkie usługi oData zwrócą dane w tym kształcie? Mogę więc założyć, że klienci Northwind będą podobni, czy muszę ręcznie wykonywać każdą usługę? – Graeme

+1

@ Grawema Nie mam pojęcia o usługach oData. Właśnie przygotowałem tę próbkę zgodnie z Twoim adresem URL. –

5

Jeśli używasz Visual Studio jest tam fantastyczna funkcja CLR Klasa generacji zbudowany w

  1. skopiować ładowność OData do schowka
  2. W Visual Studio wybrać opcję menu Edycja. ->Paste Special -> Wklej JSON jako klas obiektów

następnie można użyć Json.NET deserializacji do tych klas (jak opisano w LB odpowiedź).

+0

Jeśli widzisz tylko opcję menu "Wklej klasy XML", wklej JSON i tak raz, używając menu wklej jako xml. IDE widzi to, a następnie dodaje element menu Wklej JSON jako klasy. Wklei tam, gdzie znajduje się twój kursor - więc nowy pusty plik klasy dummy działa dobrze jako docelowy wklej. –

9

Zdefiniuj klasę na odpowiedź z OData (jego ogólna definicja, więc można to wykorzystać w przypadku każdego rodzaju):

internal class ODataResponse<T> 
{ 
    public List<T> Value { get; set; } 
} 

Cofnięcie tak:

using (var client = new HttpClient()) 
{ 
    HttpResponseMessage response = await client.GetAsync(new Uri(url)); 
    var json = await response.Content.ReadAsStringAsync(); 
    var result = JsonConvert.DeserializeObject<ODataResponse<Product>>(json); 
    var products = result.Value; 
} 
Powiązane problemy