Десериализовать JSON в список с неизвестным именем объекта в C # - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу десериализовать после 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; }
}

Как я могу десериализовать этот тип JSON с неизвестными объектами в C #?Любая помощь высоко ценится.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Использовать словарь со строкой в ​​качестве типа ключа:

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; }
}
0 голосов
/ 15 сентября 2018

Затем следует использовать динамическую переменную:

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{}
...