Как десериализовать 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).