Как преобразовать массив 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; } }
Мой код десериализации
- Заставить JSON.NET включать миллисекунды при сериализации DateTime (даже если компонент ms равен нулю)
- Как можно десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
- Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
- Как десериализовать данные JSON?
- Что такое эквивалент JSON.NET XPath, SelectNodes XML, SelectSingleNode?
JavaScriptSerializer js = new JavaScriptSerializer(); StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); string jsonString = sr.ReadToEnd(); var items = JsonConvert.DeserializeObject(jsonString);
Но после сериализации я получаю нулевые значения. Как я могу это решить?
- Альтернативное имя свойства при десериализации
- Сериализовать контейнер перечислений в виде строк с помощью JSON.net
- Json.NET Отключить десериализацию в DateTime
- Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
- Разбор JSON с использованием Json.net
- Преобразовать Newtonsoft.Json.Linq.JArray в список определенного типа объекта
- Использование JSON.NET в качестве стандартного JSON-сериализатора в ASP.NET MVC 3 - возможно ли это?
- Как изменить имена свойств при сериализации с помощью Json.net?
Как уже указывали другие, причина, по которой вы не получаете ожидаемых результатов, заключается в том, что ваш JSON не соответствует структуре classа, к которой вы пытаетесь десериализоваться. Вам либо нужно изменить JSON, либо изменить classы. Поскольку другие уже показали, как изменить JSON, я возьму здесь противоположный подход.
Чтобы соответствовать JSON, который вы опубликовали в своем вопросе, ваши classы должны быть определены следующим образом. Заметьте, что я внес следующие изменения:
- Я добавил class
Wrapper
соответствующий внешнему объекту в вашем JSON. - Я изменил свойство
ValueSet
classаValueSet
изList
вDictionary
поскольку свойствоvalues
в вашем JSON содержит объект, а не массив. - Я добавил некоторые дополнительные
[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
Я нашел ссылку выше невероятно полезной, поскольку она исправила мои 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
или если у вас есть массив json, вы можете использовать следующий список:
List
удачи
Это тоже возможно:
using System.Web.Helpers; var listOfObjectsResult = Json.Decode>(JsonData);
Вы можете использовать Json.Net framework для этого. Именно так :
Account account = JsonConvert.DeserializeObject
домашняя страница: http://json.codeplex.com/
документ об этом: http://james.newtonking.com/json/help/index.html#