我想反序列化以下JSON。
问题在于对象“ ANDE”和“ DAR”可以更改。
意味着对象是未知的,并且会根据我想反序列化的JSON进行更改。
需要反序列化大约8000个不同的对象(ANDE,DAR等)。
{"ANDE":
{"chart":[
{"date":"20180914","minute":"09:30"},{"date":"20180914","minute":"13:30"}]},
"DAR":
{"chart":[
{"date":"20180914","minute":"09:30"},{"date":"20180914","minute":"13:30"}]}}
我通过HTTP响应获取数据,并希望将其放入列表:
HttpResponseMessage response = client.GetAsync(API_PATH).GetAwaiter().GetResult();
List historicalDataList = response.Content.ReadAsAsync<List<HistoricalDataResponse>>().GetAwaiter().GetResult();
HistoricalDataResponse类如下:
public class HistoricalDataResponse
{
public string date { get; set; }
public string minute { get; set; }
}
我该如何使用C#中的未知对象反序列化这种JSON? 我们非常感谢您的帮助。
答案 0 :(得分:0)
然后您应该使用动态变量:
dynamic ReturnValue = JsonConvert.DeserializeObject(jsonstring);
请注意,与在动态对象中一样,属性是在运行时分配后确定的,因此您不会在设计时获得下拉菜单,并且因为其属性在设计时未知,并且您要在设计时进行测试即使它不正确,您也不会收到错误消息,并且在分配了错误时将在运行时得到错误消息。
dynamic ReturnValue = JsonConvert.DeserializeObject(jsonstring);
try
{
var a = ReturnValue.ANDE; // will work if it has ANDE property.
// do what you would do with ANDE
}
catch{}
try
{
var a = ReturnValue.DAR; // will work if it has DAR property.
// do what you would do with DAR
}
catch{}
答案 1 :(得分:0)
使用以字符串为键类型的字典:
void Main()
{
var client = new HttpClient();
HttpResponseMessage response = client.GetAsync("url").GetAwaiter().GetResult();
var json = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var result = JsonConvert.DeserializeObject<Dictionary<string, DateResponse>>(json);
foreach (var element in result)
{
var key = element.Key; // ANDE
foreach (var item in element.Value.Chart)
{
var date = item.date;
var minute = item.minute;
}
}
}
public class DateResponse{
public List<HistoricalDataResponse> Chart { get; set; }
}
public class HistoricalDataResponse
{
public string date { get; set; }
public string minute { get; set; }
}