2014-11-08 2 views
15

Я пытаюсь использовать сервис Борей OData:Как десериализовать oData JSON?

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

и десериализации его в коллекцию продукции:

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

Но сериализатору, кажется, не нравится odata.metadata часть и тот факт, что есть 2 odata.type записей (не уверен, что это такое).

Есть ли простой способ сделать это?

ответ

25

Использование 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

Это прекрасно работает. Огромное спасибо! – Graeme

+0

BTW, будут ли все службы OData возвращать данные в этой форме? Поэтому я могу предположить, что клиенты Northwind будут похожи, или я должен использовать каждую услугу? – Graeme

+1

@Graeme Не знаю о сервисах oData. Я только что подготовил этот образец в соответствии с вашим url. –

3

Есть .NET клиент для непосредственного потребления услуг OData. Для службы V3 odata вы можете попробовать с Simple.OData.Client, ODataLib for OData v1-3. Для службы V3 OData вы можете попробовать с OData Client Code Generator. Другие библиотеки для клиента OData, вы можете обратиться к http://www.odata.org/libraries/.

5

Если вы используете Visual Studio есть фантастическая особенность CLR Class поколения, построенный в

  1. Copy полезная нагрузка OData в буфер обмена
  2. В Visual Studio выберите пункт меню Edit -.>Paste Special -> Вставить JSON как классы объектов

Вы можете использовать Json.NET десериализации в эти классы (как описано в LB-х ответ).

+0

Если вы видите только пункт меню «Вставить XML-классы», тогда вставьте JSON в любое время, используя пасту в качестве xml-меню. IDE видит это, а затем добавляет элемент Paste JSON as Classes. Он будет вставляться туда, где находится ваш курсор, поэтому новый пустой файл класса «пустышка» хорошо работает как цель пасты. –

9

Определение класса ответа от OData (его общее определение, так что вы можете использовать это с любым типом):

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

Deserialize так:

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; 
}