C # Json.Net - Как десериализовать массив объектов, содержащий массив других объектов - PullRequest
0 голосов
/ 22 марта 2019

Данные Json, полученные с http-сервера, выглядят так:

[
   {
      "token":"NlhYnzF0xqG"
   },
   [
      {
         "ts":"2019-03-21 14:06:22.123",
         "id":"CC_RTC_Second",
         "val":"22"
      },
      {
         "ts":"2019-03-21 14:06:00.096",
         "id":"CC_RTC_Minute",
         "val":"6"
      },
      {
         "ts":"2019-03-21 14:00:00.276",
         "id":"CC_RTC_Hour",
         "val":"14"
      }
   ]
]

Я попробовал некоторые методы, представленные в документации Newtonsoft.Json, но не смог найти правильный путь.Я потратил два дня на тестирование решений из ответов StackOverflow, но безуспешно.

Какие типы и методы C # мне следует использовать в этом конкретном случае?

Структура данных может варьироваться:
Полный список атрибутов: td, id, val, flags, type, uts, nr.
Все они являются строками.
Сервер может опустить атрибуты, если они не существуют, например, Iможно получить только ts + id.
Есть ли способ работы с такими данными?

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Прежде всего, ваш json довольно сложен и его утомительная работа по созданию иерархии классов для вашего json,

Но один простой подход заключается в том, что если вы анализируете свой JSON в JArray, а затем занимает

  • 0-й элемент в один класс
  • И все остальные в списке другого класса

Тогда вы можете получить все свои данные JSON

string json = File.ReadAllText(@"Path to your json");

JArray jArray = JArray.Parse(json);

Token token = jArray[0].ToObject<Token>();
jArray.RemoveAt(0);
RandomData[] tokenData = jArray.First.ToObject<RandomData[]>();

//--------------------Print Data to Console-------------------

Console.WriteLine(token.token + "\n");

foreach (var item in tokenData)
{
    Console.WriteLine("ts: " + item.ts);
    Console.WriteLine("id: " + item.id);
    Console.WriteLine("val: " + item.val + "\n");
}

Console.ReadLine();

А классы есть,

class Token
{
    public string token { get; set; }
}

class RandomData
{
    public string ts { get; set; }
    public string td { get; set; }
    public string id { get; set; }
    public string val { get; set; }
    public string flags { get; set; }
    public string type { get; set; }
    public string uts { get; set; }
    public string nr { get; set; }
}

Вывод:

enter image description here

Примечание: Вам необходимо установить NewtonSoft пакет NuGet и импортировать using Newtonsoft.Json.Linq; пространство имен в вашу программу.

0 голосов
/ 22 марта 2019

Существует моя версия ответа:

var strData = @"[{
         'token': 'NlhYnzF0xqG'
       },
       [{
         'ts': '2019-03-21 14:06:22.123',
         'id': 'CC_RTC_Second',
         'val': '22'
       }, {
         'ts': '2019-03-21 14:06:00.096',
         'id': 'CC_RTC_Minute',

       }, {

         'id': 'CC_RTC_Hour',
         'val': '14'
       }]
     ]";   
        var result = JsonConvert.DeserializeObject<List<JToken>>(strData);
        var tokens = result.Where( x=> x.Type == JTokenType.Object).Select(x=> x.ToObject<Token>());
        var innerData = result.Where(x => x.Type == JTokenType.Array).Select(x => x.ToObject<List<InnerData>>());

есть классы:

 public class Token
        {
             public string token { set; get; }
        }
    public class InnerData
        {
            public string ts { set; get; }
            public string id { set; get; }
            public string val { set; get; }    
        }

Вы можете распечатать результаты, как это было упоминание раньше:

1008 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...