Основные параметры asp.net со словарем

Я пытаюсь читать письма как Словарь из файла appsettings.json. Мой json содержит:

    "Words": [
      "Alpha",
      "Beta",
      "Gama"
    ],
    "Letters": [
      { "A": "Alpha" },
      { "B": "Bravo" },
      { "C": "Charlie" }
    ],

Я использую класс конфигурации:

public class AppSettingsConfiguration
{
    public List<string> Words { get; set; } = default!;
    public Dictionary<string, string> Letters { get; set; } = default!;
}

свойство Words исправлено при чтении из .json, но Letters выдает исключение "Невозможно создать экземпляр типа "System.String", поскольку в нем отсутствует общедоступный конструктор без параметров".

Если бы я попытался

List<(string, string)> Letters { get; set; }
or
List<KeyValuePair<string, string>> Letters { get; set; }

Я получаю все 3 строки, но все пустые - (null, null)

Что такое правильное свойство для чтения словаря?


person David Vodička    schedule 01.04.2021    source источник
comment
К сожалению, модель, соответствующая этим данным, — List<Dictionary<string, string>>. Ничего стоп данные тоже выглядят как { "A": "Alpha" }, { "A": "Alpha", "B": "Bravo" }, { "B": "Bravo" }. Так что там не KeyValuePair<string, string>, а полный словарь.   -  person Drag and Drop    schedule 01.04.2021
comment
Letters - это массив, а не словарь. Он содержит элементы со свойствами с именами A, B, C и т. д., поэтому его нельзя десериализовать в класс KeyValuePair, свойства которого называются Key и Value. Словарь будет "Letters": { "A":"Alpha","B":"Bravo",...}   -  person Panagiotis Kanavos    schedule 01.04.2021


Ответы (2)


Словарь сериализуется по-разному в C#. См. следующий JSON:

"Letters": {
  "A": "Alpha",
  "B": "Bravo",
  "C": "Charlie"
}
person MistGun    schedule 01.04.2021

К сожалению, модель, которая соответствует этим данным, - List<Dictionary<string, string>>.
Данные остановки также не выглядят так:

{
    "Words": [
        "Alpha",
        "Beta",
        "Gama"
    ],
    "Letters": [
        { "A": "Alpha" }, 
        { "A": "Alpha", "B": "Bravo" },
        { "B": "Bravo" }
    ]
}

Так что там не KeyValuePair<string, string>, а полный словарь.

Если вы хотите вернуться к List<KeyValuePair<string, string>>, вы можете использовать простой SelectMany(x=> x)

Живая демонстрация: https://dotnetfiddle.net/CFtWm3

person Drag and Drop    schedule 01.04.2021