Добрый день , столкнулся с проблемой при парсинге 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, которое получает все дочерние элементы.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости