如何反序列化oData JSON?

Gra*_*eme 22 c# json odata

我正在尝试使用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>>();
    }
Run Code Online (Sandbox Code Playgroud)

但是序列化程序似乎并不喜欢那odata.metadata部分和事实,那里有2 odata.type条记录(不确定它们是什么).

是否有捷径可寻?

L.B*_*L.B 36

使用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);
}
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)


oza*_*mut 19

为odata的响应定义一个类(它是一个通用的定义,所以你可以在任何类型中使用它):

internal class ODataResponse<T>
 {
    public List<T> Value { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

像这样反序列化:

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;
 }
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不适用于 System.Text.Json(使用 `JsonSerializer.Deserialize&lt;ODataResponse&lt;Product&gt;&gt;()`)? (2认同)

Sco*_*ttB 9

如果您使用的是Visual Studio,则内置了一个出色的CLR Class Generation功能.

  1. 将OData有效负载复制到剪贴板
  2. 在Visual Studio中,选择菜单选项编辑 - > 选择性粘贴 - >将JSON粘贴为对象类

然后,您可以使用Json.NET反序列化到这些类中(如LB的答案中所述).


Qia*_*nLi 5

有用于直接使用 OData 服务的 .NET 客户端。对于V3 OData服务,您可以尝试Simple.OData.ClientODataLib为的OData V1-3。对于 V3 OData 服务,您可以尝试使用OData Client Code Generator。OData 客户端的其他库,可以参考http://www.odata.org/libraries/