反序列化JSON以使用C#中的未知对象名称列出

时间:2018-09-15 19:50:28

标签: c# json serialization json-deserialization

我想反序列化以下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? 我们非常感谢您的帮助。

2 个答案:

答案 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; }
}