Десериализовать объект Json со словарем внутри списка внутри объекта - PullRequest
0 голосов
/ 26 марта 2020

У меня есть набор данных в файле Json, который представляет эволюцию GPD для каждой страны каждый год. Я пытаюсь извлечь эти данные из списка, где каждый год будет словарь внутри списка.

Это часть Json, с которой я пытаюсь работать:

{
    "Name": "GPD per capita",
    "Description": "Real GDP per capita in 2011US$, 2011 benchmark (suitable for cross-country growth comparisons)",
    "Suffix": "$",
    "Multiplier": "1",
    "Data": [
        {
            "year": "1",
            "Belgium": "1050",
            "Switzerland": "1050",
            "Egypt": "1225",
            "Spain": "973",
            "France": "1050",
            "Greece": "1400",
            "Iran (Islamic Republic of)": "1225",
            "Iraq": "1225",
            "Israel": "1225",
            "Italy": "1546",
            "Jordan": "1225",
            "Portugal": "1050",
            "Tunisia": "1225",
            "Turkey": "984"
        },
        {
            "year": "730",
            "Egypt": "1278",
            "Iraq": "1610",
            "Japan": "633"
        },
        ...

И это класс, где файл Json должен быть десериализован:

[Serializable]
public class Collection
{
    public string Name;
    public string Description;
    public string Suffix;
    public ulong Multiplier;

    public List<IDictionary<string, ulong>> Data;
}

Когда я делаю Collection collection = JsonConvert.DeserializeObject<Collection>(jsonFile.ToString());, все атрибуты отображаются на консоли, но не Данные list.

Как правильно десериализовать такую ​​структуру?

1 Ответ

0 голосов
/ 26 марта 2020

interface s не являются (де) сериализуемыми, поскольку десериализатор не может знать, какой конечный фактический тип он должен десериализовать.

Вместо IDictionary просто лучше использовать фактический Dictionary

public List<Dictionary<string, ulong> Data;

В качестве альтернативы вам необходимо добавить к JSON фактический тип, чтобы сообщить десериализатору, какой тип должен использоваться для десериализации.

См. Как автоматически выбрать конкретный тип при десериализации интерфейса, используя Json. NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...