Как десериализовать oData JSON?

Я пытаюсь использовать службу Northwind OData:

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 записей (не уверен, что это такое).

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

Ответы

Ответ 1

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

Ответ 2

Определите класс для ответа от 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;
 }

Ответ 3

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

Ответ 4

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

  • Скопируйте полезную нагрузку OData в буфер обмена
  • В Visual Studio выберите опцию меню Изменить Специальная вставка → Вставить JSON в качестве классов объектов

Затем вы можете использовать Json.NET для десериализации в эти классы (как описано в ответе L.B).