Как преобразовать массив 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)
  • Json.NET Отключить десериализацию в DateTime
  • Дезициализация свойств самореференции не работает
  • Разбор JSON с использованием Json.net
  • Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?
  • Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них
  • Частные сеттеры в Json.Net
  • Как можно десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
  • .NET NewtonSoft JSON десериализует карту для другого имени свойства
  • JSON.Net Xml Сериализация неправильно понимает массивы
  • Давайте будем гением компьютера.