我正在尝试使用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)
如果您使用的是Visual Studio,则内置了一个出色的CLR Class Generation功能.
然后,您可以使用Json.NET反序列化到这些类中(如LB的答案中所述).
有用于直接使用 OData 服务的 .NET 客户端。对于V3 OData服务,您可以尝试Simple.OData.Client,ODataLib为的OData V1-3。对于 V3 OData 服务,您可以尝试使用OData Client Code Generator。OData 客户端的其他库,可以参考http://www.odata.org/libraries/。
归档时间: |
|
查看次数: |
22249 次 |
最近记录: |