Как преобразовать массив Json в список объектов в c #

У меня есть строка Json, как показано ниже.

{ "JsonValues":{ "id": "MyID", "values": { "value1":{ "id": "100", "diaplayName": "MyValue1" }, "value2":{ "id": "200", "diaplayName": "MyValue2" } } } } 

Я хочу преобразовать строку Json в classы ниже

  class ValueSet { [JsonProperty("id")] public string id { get; set; } [JsonProperty("values")] public List values { get; set; } } class Value { public string id { get; set; } public string DiaplayName { get; set; } } 

Мой код десериализации

 JavaScriptSerializer js = new JavaScriptSerializer(); StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); string jsonString = sr.ReadToEnd(); var items = JsonConvert.DeserializeObject(jsonString); 

Но после сериализации я получаю нулевые значения. Как я могу это решить?

Как уже указывали другие, причина, по которой вы не получаете ожидаемых результатов, заключается в том, что ваш JSON не соответствует структуре classа, к которой вы пытаетесь десериализоваться. Вам либо нужно изменить JSON, либо изменить classы. Поскольку другие уже показали, как изменить JSON, я возьму здесь противоположный подход.

Чтобы соответствовать JSON, который вы опубликовали в своем вопросе, ваши classы должны быть определены следующим образом. Заметьте, что я внес следующие изменения:

  1. Я добавил class Wrapper соответствующий внешнему объекту в вашем JSON.
  2. Я изменил свойство ValueSet classа ValueSet из List в Dictionary поскольку свойство values в вашем JSON содержит объект, а не массив.
  3. Я добавил некоторые дополнительные [JsonProperty] чтобы они соответствовали именам свойств в ваших объектах JSON.

Определения classов:

 class Wrapper { [JsonProperty("JsonValues")] public ValueSet ValueSet { get; set; } } class ValueSet { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("values")] public Dictionary Values { get; set; } } class Value { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("diaplayName")] public string DisplayName { get; set; } } 

Вам необходимо десериализовать class Wrapper , а не class ValueSet . Затем вы можете получить ValueSet из Wrapper .

 var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet; 

Вот рабочая программа для демонстрации:

 class Program { static void Main(string[] args) { string jsonString = @" { ""JsonValues"": { ""id"": ""MyID"", ""values"": { ""value1"": { ""id"": ""100"", ""diaplayName"": ""MyValue1"" }, ""value2"": { ""id"": ""200"", ""diaplayName"": ""MyValue2"" } } } }"; var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet; Console.WriteLine("id: " + valueSet.Id); foreach (KeyValuePair kvp in valueSet.Values) { Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id); Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName); } } } 

И вот вывод:

 id: MyID value1 id: 100 value1 name: MyValue1 value2 id: 200 value2 name: MyValue2 

http://json2csharp.com/

Я нашел ссылку выше невероятно полезной, поскольку она исправила мои classы C #, вызвав их из JSON, который был фактически возвращен.

Затем я позвонил:

 JsonConvert.DeserializeObject(jsonString); 

и все работало, как ожидалось.

Ваша структура данных и ваш JSON не совпадают.

Ваш JSON:

 { "JsonValues":{ "id": "MyID", ... } } 

Но структура данных, к которой вы пытаетесь ее сериализовать, такова:

 class ValueSet { [JsonProperty("id")] public string id { get; set; } ... } 

Вы пропустите шаг: ваш JSON – это class, у которого есть одно свойство JsonValues , которое имеет объект вашей ValueSet данных ValueSet как значение.

Также в вашем classе ваш JSON:

 "values": { ... } 

Ваша структура данных такова:

 [JsonProperty("values")] public List values { get; set; } 

Обратите внимание, что { .. } в JSON определяет объект, где [ .. ] определяет массив. Поэтому, согласно вашему JSON, у вас нет кучи значений, но у вас есть one объект значений со значениями value1 и value2 типа Value .

Поскольку десериализатор ожидает массив, но вместо него получает объект, он выполняет наименее неразрушающую (исключение) вещь, которую он может сделать: пропустите значение. values свойств остаются со значением по умолчанию: null .

Если вы можете: Отрегулируйте свой JSON. Следующее будет соответствовать вашей структуре данных и, скорее всего, вы действительно хотите:

 { "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1" }, { "id": "200", "diaplayName": "MyValue2" } ] } 

у вас есть непревзойденная строка jSon, если вы хотите конвертировать в список, попробуйте это

 { "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1", }, { "id": "200", "diaplayName": "MyValue2", } ] } 

Вы проверили, что эта линия работает отлично, и ваша строка имеет значение в ней?

string jsonString = sr.ReadToEnd();

если да, попробуйте этот код для последней строки:

ValueSet items = JsonConvert.DeserializeObject(jsonString);

или если у вас есть массив json, вы можете использовать следующий список:

List items = JsonConvert.DeserializeObject>(jsonString);

удачи

Это тоже возможно:

  using System.Web.Helpers; var listOfObjectsResult = Json.Decode>(JsonData); 

Вы можете использовать Json.Net framework для этого. Именно так :

Account account = JsonConvert.DeserializeObject(json);

домашняя страница: http://json.codeplex.com/

документ об этом: http://james.newtonking.com/json/help/index.html#

  • Разбор JSON с использованием Json.net
  • Как можно десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
  • Альтернативное имя свойства при десериализации
  • Может ли Json.NET сериализовать / десериализовать в / из streamа?
  • Как я могу десериализовать JSON для простого словаря в ASP.NET?
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Deserialize json, который имеет некоторое имя свойства, начиная с числа
  • JSON.net сериализуется непосредственно из oledbconnection
  • Отключить classы JSON до C #
  • Десериализация JSON с использованием JSon.NET с динамическими данными
  • Json.NET Отключить десериализацию в DateTime
  • Interesting Posts

    Получение кода ошибки 0xc004f210 при попытке активации Windows 10 с помощью ключа продукта Windows 8

    Избегайте корпоративных заблокированных URL-адресов, когда в Cisco VPN

    java runtime.getruntime () получение результата от выполнения командной строки

    Хранить таблицы от переломов страниц

    Первая попытка воспроизвести любой звук после загрузки приводит к 30-секундной задержке

    == и .equals () не работает в java

    Скрытие всех выбранных строк данных

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

    Как TransactionScope откатывает транзакции?

    Преимущества / Недостатки разделения диска

    Инвертирование направления колеса прокрутки мыши

    Являются ли “{Binding Path =.}” И “{Binding}” действительно равными

    Загружать локальный HTML-файл в C # WebBrowser

    Qt – обновление основного windows со вторым streamом

    Характер Caret между типами, а не переменными, окруженный круглыми скобками

    Давайте будем гением компьютера.