Только быстрый!
У меня есть три класса объектов.
public class Parent
{
public string name { get; set; }
public Children child{ get; set; }
}
public class Children
{
public Dictionary<string, item> item{ get; set; }
}
public class item
{
public string id { get; set; }
public string type { get; set; }
}
Строка JSON, которую я использую:
{
'name': 'Child1',
'Children': {
'item-1253': {
'id': 'car',
'type': 'car'
},
'item-4343': {
'id': 'car',
'type': 'car'
}......
}
}
Использовал:
test = JsonConvert.DeserializeObject<Parent>(json);
Результат был "item": null
. Могу ли я спросить, почему? Как я могу получить доступ ко всем свойствам в этом объекте элемента, поскольку для каждого дочернего элемента будет несколько элементов, а имя объекта элемента является динамическим, например. item_id12434
. Я хотел бы, чтобы объект был сам по себе, как мне этого добиться? Будет ли что-то подобное работать? List<Dictionary<string, item>>
Кроме того, '
не является допустимым разделителем строк в json, вы уверены, что это не "
?
@LasseVågsætherKarlsen Да, я пробовал «ключ» по-прежнему нулевой, и он является законным (с ним его можно сериализовать)
Вы назвали свое свойство child
, тогда как свойство json называется Children
, это несоответствие не будет обрабатываться автоматически. Обратите внимание, что используется имя свойства объекта, а не его тип. Однако есть дополнительные проблемы.
Например, у вас есть Dictionary<string, item>
, тогда как ваш «элемент» в вашем json — это строка. Если вы измените child
на children
и измените свойство словаря на Dictionary<string, string>
, он будет десериализован. Вам не нужен тип item
.
@LasseVågsætherKarlsen Просто для моего понимания. Я использовал словарь, потому что имя объекта является динамическим и меняется. Я создал тип, поскольку он будет содержать все свойства этого объекта, включая список, массив и т. д. Как я могу правильно сопоставить его, если имя является динамическим?
Измените свои классы, чтобы они выглядели так, и они будут корректно десериализованы.
public static class Program
{
static void Main(string[] args)
{
string str = @"{
'name': 'Child1',
'Children': {
'item-1253': {
'id': 'car',
'type': 'car'
},
'item-4343': {
'id': 'car',
'type': 'car'
}
}
}";
// Way 1) Using POCO
Parent parent = JsonConvert.DeserializeObject<Parent>(str);
// Way 2) Using dynamic
dynamic deserializedDynamicObject = JsonConvert.DeserializeObject<dynamic>(str);
// Way 3) Using JObject
JObject deserializedJObject = JsonConvert.DeserializeObject<JObject>(str);
List<JObject> childrenObjects = deserializedJObject["Children"]
.Cast<JProperty>()
.Select(x => x.Value)
.Cast<JObject>()
.ToList();
}
}
public class Parent
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("Children")]
public Dictionary<string, Item> Children { get; set; }
}
public class Item
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
}
JsonProperty для элемента является динамическим именем, например. следующим может быть пункт-1213
Спасибо за ваш ответ. сам элемент является уникальным идентификатором, поэтому структура будет выглядеть примерно так. { 'name': 'Child1', 'Children': { 'item-1253': { 'id': 'car', 'type': 'car' }, 'item-4343': { 'id': ' автомобиль', 'тип': 'автомобиль' }...... } }
Я получаю вывод первого элемента, однако есть еще два объекта элементов, которые необходимо вывести.
@Mask-dCodex Является ли Children
массивом объектов?
Нет, это просто еще один объект внутри детей. пожалуйста, посмотрите мой пример json выше :) Надеюсь, это имеет смысл
Я не думаю, что это соответствует моей текущей структуре, поскольку у меня есть дети в отдельном объекте, который содержит несколько элементов. Поэтому я не могу использовать [JsonProperty("Children")] как внутри дочернего объекта. Глядя на структуру моего объекта, мне нужно было бы иметь уникальное имя в качестве свойства json, правильно ли это?
@Mask-dCodex Нет другого способа сделать это, кроме этого. Или лучше десериализовать в JObject
Как я могу добиться этого, поскольку все свойства в этом объекте содержат одно и то же свойство, но просто другое имя объекта.
@Mask-dCodex, я не понял
Можете ли вы показать, как это реализовать, используя приведенный выше пример? Чтобы я мог ввести свой JSON
Пример ФИКСИРОВАННЫЙ: https://dotnetfiddle.net/7TK008
Пожалуйста, посмотрите на рабочий пример - https://dotnetfiddle.net/eiMEkr
Вы делаете два вопроса:
неправильное имя параметра Дети - должно быть ребенок
неправильное определение объекта словаря
const string json = @"
{
'name':'Child1',
'child':{
'item':{
'dict_item':{
'id':'car1',
'type':'car2'
}
}
}
}";
var test = JsonConvert.DeserializeObject<Parent>(json);
Понимаю. Спасибо, Влад, у меня вопрос. 'item' будет иметь уникальное динамическое имя. Я думаю, что я реализовал это неправильно. Мне нужно было несколько таких элементов: «ребенок»: { «элемент»: { «id»: «car1», «type»: «car2» }, «item2»: { «id»: «car1», «type» :'car2' }. Пожалуйста, смотрите мой пример выше. Я неправильно использовал словарь?
Судя по вашему примеру, это объектный элемент {}, который содержит список из нескольких dict_item {}, но я бы хотел, чтобы несколько элементов {} были самостоятельными.
@Mask-dCodex: необходимо удалить класс Дети и определить словарь напрямую в классе Родитель, посмотрите исправленный пример в ответе.
Не могли бы вы опубликовать минимальный воспроизводимый пример?