Json deserialize Dictionary<key,value> возвращает значение null

Только быстрый!

У меня есть три класса объектов.

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>>

Не могли бы вы опубликовать минимальный воспроизводимый пример?

Lasse V. Karlsen 09.04.2019 09:42

Кроме того, ' не является допустимым разделителем строк в json, вы уверены, что это не "?

Lasse V. Karlsen 09.04.2019 09:42

@LasseVågsætherKarlsen Да, я пробовал «ключ» по-прежнему нулевой, и он является законным (с ним его можно сериализовать)

Freddy. 09.04.2019 09:44

Вы назвали свое свойство child, тогда как свойство json называется Children, это несоответствие не будет обрабатываться автоматически. Обратите внимание, что используется имя свойства объекта, а не его тип. Однако есть дополнительные проблемы.

Lasse V. Karlsen 09.04.2019 09:54

Например, у вас есть Dictionary<string, item>, тогда как ваш «элемент» в вашем json — это строка. Если вы измените child на children и измените свойство словаря на Dictionary<string, string>, он будет десериализован. Вам не нужен тип item.

Lasse V. Karlsen 09.04.2019 09:56

@LasseVågsætherKarlsen Просто для моего понимания. Я использовал словарь, потому что имя объекта является динамическим и меняется. Я создал тип, поскольку он будет содержать все свойства этого объекта, включая список, массив и т. д. Как я могу правильно сопоставить его, если имя является динамическим?

Freddy. 09.04.2019 10:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
651
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените свои классы, чтобы они выглядели так, и они будут корректно десериализованы.

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

Freddy. 09.04.2019 10:17

Спасибо за ваш ответ. сам элемент является уникальным идентификатором, поэтому структура будет выглядеть примерно так. { 'name': 'Child1', 'Children': { 'item-1253': { 'id': 'car', 'type': 'car' }, 'item-4343': { 'id': ' автомобиль', 'тип': 'автомобиль' }...... } }

Freddy. 09.04.2019 11:33

Я получаю вывод первого элемента, однако есть еще два объекта элементов, которые необходимо вывести.

Freddy. 09.04.2019 11:34

@Mask-dCodex Является ли Children массивом объектов?

Kunal Mukherjee 09.04.2019 11:40

Нет, это просто еще один объект внутри детей. пожалуйста, посмотрите мой пример json выше :) Надеюсь, это имеет смысл

Freddy. 09.04.2019 11:51

Я не думаю, что это соответствует моей текущей структуре, поскольку у меня есть дети в отдельном объекте, который содержит несколько элементов. Поэтому я не могу использовать [JsonProperty("Children")] как внутри дочернего объекта. Глядя на структуру моего объекта, мне нужно было бы иметь уникальное имя в качестве свойства json, правильно ли это?

Freddy. 09.04.2019 12:23

@Mask-dCodex Нет другого способа сделать это, кроме этого. Или лучше десериализовать в JObject

Kunal Mukherjee 09.04.2019 12:25

Как я могу добиться этого, поскольку все свойства в этом объекте содержат одно и то же свойство, но просто другое имя объекта.

Freddy. 09.04.2019 15:27

@Mask-dCodex, я не понял

Kunal Mukherjee 09.04.2019 15:28

Можете ли вы показать, как это реализовать, используя приведенный выше пример? Чтобы я мог ввести свой JSON

Freddy. 09.04.2019 15:30
Ответ принят как подходящий

Пример ФИКСИРОВАННЫЙ: https://dotnetfiddle.net/7TK008


Пожалуйста, посмотрите на рабочий пример - https://dotnetfiddle.net/eiMEkr

Вы делаете два вопроса:

  1. неправильное имя параметра Дети - должно быть ребенок

  2. неправильное определение объекта словаря

    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' }. Пожалуйста, смотрите мой пример выше. Я неправильно использовал словарь?

Freddy. 09.04.2019 10:52

Судя по вашему примеру, это объектный элемент {}, который содержит список из нескольких dict_item {}, но я бы хотел, чтобы несколько элементов {} были самостоятельными.

Freddy. 09.04.2019 11:07

@Mask-dCodex: необходимо удалить класс Дети и определить словарь напрямую в классе Родитель, посмотрите исправленный пример в ответе.

vladimir 10.04.2019 02:40

Другие вопросы по теме