Как преобразовать массив 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.net
  • Не удалось загрузить файл или сборку «Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed»
  • Как преобразовать datatable в строку json с помощью json.net?
  • Поиск конкретного JToken по имени в иерархии JObject
  • Как написать Json-файл в C #?
  • JSON.NET Parser * кажется * будет двойной сериализацией моих объектов
  • Сериализация нулевого значения в JSON.NET
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Интерфейсы для десериализации в JSON.NET
  • JSON.net сериализуется непосредственно из oledbconnection
  • Как сериализовать словарь как часть его родительского объекта с помощью Json.Net
  • Interesting Posts

    Могу ли я изменить высоту изображения в CSS: до /: после псевдоэлементов?

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

    Как перезапустить панель задач?

    Переопределить кнопку питания так же, как кнопка «Домой»

    Как отредактировать абзац в Notepad ++?

    R: извлечение «чистого» текста UTF-8 с веб-страницы, очищенной с помощью RCurl

    Как мне перейти на Snow Leopard без CD-привода?

    Может ли плагин Twitter-бутстрапа Twitter-карусели исчезать и выходить на слайд-переход

    Установка нескольких переменных среды в оболочке, созданной через пакетный скрипт Windows

    Когда необходимо или удобно использовать Spring или EJB3 или все вместе?

    ZipArchive создает недопустимый ZIP-файл

    Поток и ленивая оценка

    Есть ли способ избавиться от акцентов и преобразовать целую строку в обычные буквы?

    Соответствие предложения с помощью grep

    Каким образом Firefox кэширует содержимое формы в любом месте, где я могу восстановить?

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