Добрый день , столкнулся с проблемой при парсинге Json средствами C#. Библиотека:Newtonsoft
При стандартном парсинге например: JSON
{"success":1,"return":2}
C#
class info{
public int success {get;set;}
public int return{get;set;}
}
info result = JsonConvert.DeserializeObject<info>(jsonstring);
При таком раскладе все впорядке, вопросов нет. А как быть со вложенными массивами, когда имя ветки не известно. Например:
{
"success":1,
"return":{
"ИМЯ И КОЛ ВО НЕ ИЗВЕСТНО":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
},
{
"ИМЯ И КОЛ ВО НЕ ИЗВЕСТНО":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
}
Как правильно составить класс?
Так-то всё просто: нужно использовать словарь (Dictionary
) для узлов с неизвестным заранее названием.
Если бы вы привели валидный json, было бы намного легче дать точный ответ.
Допустим, имеется следующий json:
{
"success":1,
"return":{
"name1":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
},
"name2":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
}
}
}
Набор классов для его десериализации:
public class Info
{
[JsonProperty("success")]
public int Success { get; set; } // можно заменить на bool
[JsonProperty("return")]
public Dictionary<string, Item> Return { get; set; }
}
public class Item
{
[JsonProperty("per1")]
public string Per1 { get; set; }
[JsonProperty("timestamp_created")]
public int TimeStampCreated { get; set; }
[JsonProperty("status")]
public int Status { get; set; }
}
Использование:
var info = JsonConvert.DeserializeObject<Info>(json);
Console.WriteLine(info.Success);
foreach (var ret in info.Return)
{
Console.WriteLine(ret.Key + ":");
var item = ret.Value;
Console.WriteLine(item.Per1 + " " + item.TimeStampCreated + " " + item.Status);
}
В случае десериализации, именно данным способом, должно быть обязательно известно имя, так как на его парсер JSON десериализует на основе класса, который вы указываете при параметризации десериализатора. Однако количество знать не обязательно, вы можете указать свойство, количество которого не известно, как любую коллекцию. Например можете сделать вот так: JSON
{
"success":1,
"return":{
"answer":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
},
{
"answer":{
"per1":"auth",
"timestamp_created":1418654530,
"status":0
}
C#
class info{
public int success {get;set;}
public Answer[] return{get;set;}
}
class Answer
{
public string per1 {get;set;}
public uint timestamp_created {get;set}
public int status {get;set}
}
Вам необходимо использовать LINQ to JSON. Так это работает:
JObject o = JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}");
string cpu = (string)o["CPU"];
// Intel
string firstDrive = (string)o["Drives"][0];
// DVD read/writer
IList<string> allDrives = o["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
Для парсинга есть 3 основных объекта: JObject
, JArray
, JValue
.
Официальная документация - https://www.newtonsoft.com/json/help/html/LINQtoJSON.htm
В вашем случае для return (JObject) вам необходимо использовать свойство JObject.ChildrenTokens, которое получает все дочерние элементы.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Нужно создать открытку на новогоднюю тематику на языке C#Помогите пожалуйста, как сделать падающий снег и еще что нибудь подобное!
Здравствуйте, есть ли способ правильно складывать прошлые значения аргументов с новыми?
Element - Input с type = radioДанный участок кода работает корректно в Chrome,Opera , но не работает в Edge как это можно пофиксить ?