Это мой первый вопрос о 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 - это просто опечатка при переименовании в правильном классе ради этого примера
bool_plate
/ on_plate
также должен иметь тип
@PrasadTelkikar Обновил мой комментарий ;о)
Просто хотите знать, почему ваш обновленный класс отличается от класса ответа?
Как сказал @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; }
}
Попробуйте
List<KeyValuePair<string, int>>
вместо этого