Десериализовать json со строкой, массивом int — .net core C#

Это мой первый вопрос о stackoverflow — до сих пор я всегда находил здесь решение :)

Я пытаюсь десериализовать объект JSON. Проблема заключается в списке "count", потому что элементы могут меняться - имя и значение. Я думаю, что лучше всего для этого использовать Словарь - но компилятор выдает ошибки.

{
  "count": [
    {"apple": 2},
    {"strawberry": 8},
    {"pear": 2}
  ],
  "on_plate": true,
  "owner": "Billy"
}

Мой класс С#:

    public class FruitsDTO
    {
        public Dictionary<string, int> count { get; set; }
        public bool on_plate{ get; set; }
        public string owner{ get; set; }
    }
var respResponse = JsonConvert.DeserializeObject<FruitsDTO>(jsonObject);

И результат: Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «System.Collections.Generic.Dictionary`2[System.String,System.Int32]», поскольку для этого типа требуется объект JSON (например, {"name ":"value"}) для правильной десериализации.

ОТРЕДАКТИРОВАНО

Спасибо @Phuzi и @Prasad Telkikar :)

Я меняю класс на:

    public class FruitsDTO
    {
        public Dictionary<string, int> count { get; set; }
        public Dictionary<string, int> Count2
            {
                get => Count.SelectMany(x => x).ToDictionary(x => x.Key, x => x.Value);
            }
        public bool on_plate{ get; set; }
        public string owner{ get; set; }
    }

Count2 - это именно то, что мне нужно.

Bool_plate - это просто опечатка при переименовании в правильном классе ради этого примера

Попробуйте List<KeyValuePair<string, int>> вместо этого

phuzi 21.12.2020 10:46
bool_plate / on_plate также должен иметь тип
phuzi 21.12.2020 10:51

@PrasadTelkikar Обновил мой комментарий ;о)

phuzi 21.12.2020 10:54

Просто хотите знать, почему ваш обновленный класс отличается от класса ответа?

MichaelMao 21.12.2020 12:19
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
4
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как сказал @Phuzi, тип переменной count должен быть List<Dictionary<string, int>>> не только Dictionary<string, int>>.

Если вы заметили, что свойство json object count состоит из списка фруктов, а не из одного фрукта

Обновите свой DTO, как показано ниже,

public class FruitsDTO
{
    public List<Dictionary<string, int>> count { get; set; }  //Update type to list
    public bool on_plate { get; set; }   //update property name to on_plate
    public string owner { get; set; }
}

Затем десериализуйте,

var respResponse = JsonConvert.DeserializeObject<FruitsDTO>(jsonObject);

2 варианта этого

Вариант 1, используйте словарь с парой ключ-значение.

Option2 определяет класс для подсчета.

Добавьте еще один класс:

public class FruitsDTO
{
    public List<FruitCounter> count { get; set; }
    public bool bool_plate{ get; set; }
    public string owner{ get; set; }
}

public class FruitCounter
{
    public string value { get; set; }
    public int amount { get; set; }
}

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