C# парсинг JSON

306
16 декабря 2017, 04:04

Добрый день , столкнулся с проблемой при парсинге 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
        }

Как правильно составить класс?

Answer 1

Так-то всё просто: нужно использовать словарь (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);
}
Answer 2

В случае десериализации, именно данным способом, должно быть обязательно известно имя, так как на его парсер 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}
}
Answer 3

Вам необходимо использовать 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, которое получает все дочерние элементы.

READ ALSO
Новогодняя открытка в C# [требует правки]

Новогодняя открытка в C# [требует правки]

Нужно создать открытку на новогоднюю тематику на языке C#Помогите пожалуйста, как сделать падающий снег и еще что нибудь подобное!

332
Как складывать значения аргумента?

Как складывать значения аргумента?

Здравствуйте, есть ли способ правильно складывать прошлые значения аргументов с новыми?

418
Jquery data() funiction не работает в Edge [требует правки]

Jquery data() funiction не работает в Edge [требует правки]

Element - Input с type = radioДанный участок кода работает корректно в Chrome,Opera , но не работает в Edge как это можно пофиксить ?

283