Как десериализовать массивы внутри массивов на C # с помощью newtonsoft

Muhamad Dwi Susanto спросил: 28 марта 2018 в 01:47 в: c#

Я хочу десериализовать данные JSON. Как я могу десериализовать его на объект или список класса C #?

[  
   2074,
   [  
      0,
      0,
      0,
      1,
      0,
      0,
      0
   ],
   0,
   [  
      {  
         "886":[  
            "Anna Bay"
         ],
         "3971":[  
            "Dmitry Khraponenkov"
         ]
      },
      [  
         3971,
         886
      ]
   ]
]

Мне нужно разобрать имена.

Я пробовал это, но это совсем другая вещь: newtonsoft.com/json/help/html/DeserializeCollection.htm

2 ответа

Brian Rogers ответил: 28 марта 2018 в 05:05

Не зная больше о том, что именно представляют эти данные или в какую структуру классов вы бы хотели их десериализовать, трудно дать полезный совет. Но если я восприму ваш вопрос буквально как "вот какой-то JSON со смешанными типами данных; как мне извлечь из него имена?", То вы можете решить эту проблему с помощью API LINQ-to-JSON Json.Net:

string json = @"[ 2074, [ 0, 0, 0, 1, 0, 0, 0 ], 0, [{ ""886"": [ ""Anna Bay"" ], ""3971"": [ ""Dmitry Khraponenkov"" ] }, [ 3971, 886 ] ] ]";List<string> names = JArray.Parse(json)
    .Descendants()
    .OfType<JProperty>()
    .SelectMany(p => p.Value, (p, t) => (string)t)
    .ToList();Console.WriteLine(string.Join(Environment.NewLine, names));

Fiddle: https://dotnetfiddle.net/EJOKeW

Jake Reece ответил: 28 марта 2018 в 03:10

Примечание о JSON

JSON используется для представления структуры данных. Содержащиеся данные часто представляют собой набор пар имя-значение. Сопряжение каждого значения с именем позволяет потребителю работать с JSON без предварительного знания данных или структуры данных. Как отмечает Брайан в комментариях ниже, JSON также может быть набором значений, но это накладывает бремя интерпретации этих значений на потребителя.

Вернуться к вашему вопросу

Большинство ваших значений не имеют имен, что затрудняет десериализацию в объект класса C #.

Если вы можете изменить JSON, сделайте это и присвойте каждому значению имя.

Если вы не можете изменить JSON, вы можете просто проанализировать строку.


Чтобы узнать больше о JSON, посетите: https://developer.mozilla. орг / EN-US / документы / Learn / JavaScript / Объекты / JSON

Brian Rogers ответил: 28 марта 2018 в 02:57
Я должен не согласиться. JSON не является"по определению коллекцией пар имя-значение". Это только один компонент JSON. JSON также состоит из массивов и простых значений. (См. JSON.org.) Фактически, вы можете иметь совершенно корректный JSON, который вообще не содержит пар имя-значение, например ["foo", "bar", "baz"]. Конечно, трудно десериализовать смешанные данные, такие как OP, в структуру класса, но это можно сделать с помощью одного или нескольких пользовательских JsonConverters, при условии, что мы знаем, как должны отображаться данные (что OP не удосужился объяснить нам).
Jake Reece ответил: 28 марта 2018 в 03:11
@BrianRogers Ты прав. Мое первоначальное определение было слишком строгим. Я обновил свой ответ. Спасибо за ответ.