Lupu5R3x Ответов: 2

Десериализация файла json


Привет Может ли кто-нибудь указать мне направление, как десериализовать json?

{
   "UpdatePack":"updatePacks\/1585654836.pack",
   "Updates":[
      {
         "Name":"MsgBoxEx",
         "version":"1.5.14.88",
         "ChangeLog":"BugFix: Form didn't resize correct.",
         "Hash":"5FB23ED83693A6D3147A0485CD13288315F77D3D37AAC0697E70B8F8C9AA0BB8"
      
},
      {
         "Name":"Utilities",
         "version":"2.5.1.58",
         "ChangeLog":"StringManagement updated.",
         "Hash":"05E6B3F521225C604662916F50A701E9783E13776DE4FCA27BE4B69705491AC5"
      
}
   
]
}




Я совсем новичок в json.

Что я уже пробовал:

Прочитал то, что смог найти из статей, попробовал с классом перечислить.

2 Ответов

Рейтинг:
14

Afzaal Ahmad Zeeshan

Вы можете прочитать мою статью, чтобы понять, как работать с данными JSON в C#, От нуля до героя в JSON с C#[^]. Он дает вам обзор данных JSON, библиотеку Newtonsoft для обработки JSON и кучу других советов. Теперь, что касается вопроса и этих данных JSON, прочитайте остальную часть ответа.

Вы можете создать Dictionary<int, Type> и храните значения в этой коллекции. Причина в том, что в C# 0 и 1 не могут использоваться в качестве имен для свойств. Вам нужно будет создать класс, который будет ловить объекты в Dictionary Это дало бы вам начало:

public class MyData {
   public string Name { get; set; }
   public string Version { get; set; }
   public string ChangeLog { get; set; }
   public string Hash { get; set; }
}
Теперь ваш держатель объекта JSON станет:

public class JsonObjectHolder {
   public string Updates { get; set; }
   public Dictionary<int, MyData> { get; set; }
}
Теперь вы можете десериализовать JSON в объекты с помощью Json.NET:
var jsonObjectHolder = JsonConvert.DeserializeObject<JsonObjectHolder>(yourData);
Было бы хорошо сохранить имена согласованными, чтобы библиотека могла вам помочь. Но если вы не можете управлять данными из API или именованием объектов JSON, то вы можете использовать этот подход для десериализации значений.

Это допустимый JSON, потому что JavaScript практически ничего не навязывает в соглашениях об именах. В JavaScript следующие два оператора являются допустимыми:
var firstObject = jsonObjectHandler.prop;
var firstObject = jsonObjectHandler['prop'];
Таким образом, ваш код действителен в области JavaScript, и вы можете получить доступ к значениям следующим образом:
var firstObject = jsonObjectHandler['0'];
Однако в C# вы не можете сделать это для свойств, и вам нужно использовать Dictionary.


Lupu5R3x

Привет Afzaal
Я получил сообщение об ошибке с помощью этого: JsonObjectHolder открытый класс {
публичные обновления строк { get; set; }
публичный словарь<int, mydata=""> { get; set; }
}
Но исправил это, добавив имя в словарь prop, public Dictionary<int, mydata=""> Dict { get; set; }

Но я не могу войти в контакт со словарем, я пытался:
var jsonTest = JsonConvert.DeserializeObject<jsonobjectholder>(serverResponseJsonString.Результат);

Приставка.WriteLine(jsonTest.UpdatePack);
Приставка.WriteLine(jsonTest.Dict.Рассчитывать);

foreach (KeyValuePair<int, updateslist=""> item in jsonTest.Dict)
{
Приставка.WriteLine(item.Key);
}
Но я получаю необработанное исключение: System.NullReferenceException: ссылка на объект не установлена на экземпляр object. at " Console.WriteLine(jsonTest.Dict.Count);", и я комментирую это и пробую свой цикл foreach, я получаю ту же ошибку.

Что я делаю не так?

/LR

Lupu5R3x

Ответ афзаала указал мне правильное направление, хотя для этого нужно было еще немного поработать, но если бы я вставил неправильный Json, я думаю, что Афзаал бросил бы правильный ответ, поэтому я принимаю его решение.
Я добавил код, который работает ниже.

Рейтинг:
0

Lupu5R3x

Этот код работает для меня, чтобы получить доступ к Json.

Класс:

public class JsonObjectHolder
   {
       public string UpdatePack { get; set; }
       //public Dictionary<int, MyData> { get; set; }
       public Dictionary<int, UpdatesList> Updates { get; set; }
   }
   public class UpdatesList
   {
       public string Name { get; set; }
       public string Version { get; set; }
       public string ChangeLog { get; set; }
       public string Hash { get; set; }
   }

А десериализация:
var json = JObject.Parse(serverResponseJsonString.Result);
            var list = json["Updates"]?.ToObject<List<UpdatesList>>();
            //var dict = new Dictionary<int, UpdatesList>();
            var holder = new JsonObjectHolder
            {
                UpdatePack = json["UpdatePack"]?.Value<string>(),
                Updates = list.Select((updatesList, index) => new { updatesList, index })
                                .ToDictionary(x => x.index, x => x.updatesList)
            };


Richard Deeming

Измените свой JsonObjectHolder класс к:

public class JsonObjectHolder
{
   public string UpdatePack { get; set; }
   public List<UpdatesList> Updates { get; set; }
}
Затем вы можете десериализоваться с помощью кода Afzaal:
var holder = JsonConvert.DeserializeObject<JsonObjectHolder>(yourData);

Lupu5R3x

Вот что я сделал, кто-то сказал мне, что я могу использовать свой json как классы C#, и это сохранит почти тот же результат, что и у Афзаала.

/LR