我试图拿一些丑陋的json,看起来像这样:
将其反序列化到我的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#对象?
答案 0 :(得分:0)
我做了一些你没有说明的假设:
对于日期属性,您要添加Json.net附带的属性[IsoDateTimeConverter]
因此...
[IsoDateTimeConverter]
public DateTime CreatedOn { get; }
默认情况下,DateTime属性不会解析ISO 8601字符串,您必须使用转换器。
基本上,这是你对Guid等的答案,除此之外你还必须为自己实现这些转换器。您必须创建转换器类,并读取输入字符串,并将其解析为Guid对象。然后使用[YourCustomGuidConverter]属性装饰每个Guid属性。