如何将odata json转换为具体的DTO

时间:2017-06-07 17:33:35

标签: c# .net json visual-studio asp.net-web-api2

我试图拿一些丑陋的json,看起来像这样:

enter image description here

将其反序列化到我的DTO:

public class Account
{
    [JsonProperty("@odata.etag")]
    public string etag { get; set; }
    public Guid accountid { get; }
    public DateTime CreatedOn { get; }
    public Guid OwnerId { get; }
    public string Name { get; set; }
    public DateTime ModifiedOn { get; }
    public Guid CreatedBy { get; }

}

public class RootObject
{
    [JsonProperty("@odata.context")]
    public string context { get; set; }
    public List<Account> value { get; set; }
}

这就是我尝试这样做的方式:

    public async Task<Account> GetAccount(string query)
    {
        var task = await Client.HTTPCLIENT.GetAsync(Client.HTTPCLIENT.BaseAddress + query);
        var jsonString = await task.Content.ReadAsStringAsync();
        var value = JsonConvert.DeserializeObject<RootObject>(jsonString);
        return value.value.First();
    }

我的回答部分有效:

{"@odata.etag":"W/\"608578\"","accountid":"00000000-0000-0000-0000-000000000000","CreatedOn":"0001-01-01T00:00:00","OwnerId":"00000000-0000-0000-0000-000000000000","Name":"Smith","ModifiedOn":"0001-01-01T00:00:00","CreatedBy":"00000000-0000-0000-0000-000000000000"}

我做错了什么?如何将此odata json响应转换为c#对象?

1 个答案:

答案 0 :(得分:0)

我做了一些你没有说明的假设:

  • 我假设您正在使用Json.net

对于日期属性,您要添加Json.net附带的属性[IsoDateTimeConverter]

因此...

[IsoDateTimeConverter]
public DateTime CreatedOn { get; }

默认情况下,DateTime属性不会解析ISO 8601字符串,您必须使用转换器。

基本上,这是你对Guid等的答案,除此之外你还必须为自己实现这些转换器。您必须创建转换器类,并读取输入字符串,并将其解析为Guid对象。然后使用[YourCustomGuidConverter]属性装饰每个Guid属性。