Инициализация словаря C# путем десериализации файла Json

У меня есть файл Json с огромным массивом простых данных, экспортированных из базы данных:

{
    "type": "table",
    "name": "WMIs",
    "database": "someDB",
    "data": 
[
{
    "WMI": "SG7",
    "Manufacturer": "ABI (GB)"
},
{
    "WMI": "WAB",
    "Manufacturer": "ABL"
},
...
{
    "WMI": "Z29",
    "Manufacturer": "SIP (SLO)"
}]}

Я хочу десериализовать данные в словарь‹string, string› со значениями WMI в качестве ключей и значениями производителя в качестве значения, чтобы более тысячи этих пар ключ-значение выглядели бы так, если бы инициализировались вручную:

{"SG7", "ABI (GB)"},
{"WAB", "ABL"},
//...and so on

Моя проблема: при преобразовании строки Json

string json= @"{""WMI"":""SG7"",""Manufacturer"":""ABI (GB)""},{""WMI"":""WAB"",""Manufacturer"":""ABL""}";

в список работал нормально, используя Newtonsoft для чтения из файла и приведения в словарь, подобный этому

Dictionary<string, string> dictObj = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(jsonPath));

создает это исключение:

Newtonsoft.Json.JsonReaderException: при синтаксическом анализе значения обнаружен неожиданный символ: [. Путь «данные», строка 6, позиция 1.

Редактировать: Хорошо, я решил отформатировать файл Json следующим образом.

[
{
    "SG7":"ABI (GB)"
},
...
{
    "Z29":"SIP (SLO)"
}]

И применил решение Digvijay отсюда: массив JSON в словарь C#, теперь выглядящий как это:

string jsonPath = @"C:\filepath\myJson.json";
            JArray a = JArray.Parse(File.ReadAllText(jsonPath));

            Dictionary<string, string> dictSingleWMI = new Dictionary<string, string>();

            foreach (JObject o in a.Children<JObject>())
            {
                foreach (JProperty p in o.Properties())
                {
                    string manufacturer = (string)p.Value;
                    string wmi = (string)p.Name;
                    if (!dictSingleWMI.ContainsKey(wmi))
                    {
                        dictSingleWMI.Add(wmi, manufacturer);
                    }
                }

Это работает! Тем не менее, если кто-нибудь знает, как сообщить парсеру/преобразователю, как работать с исходным форматом, я был бы рад получить ваш вклад!


person RasRakaras    schedule 02.01.2021    source источник
comment
Кстати, при удалении заголовка файла Json, который теперь начинается с «[», исключение изменяется на Newtonsoft.Json.JsonSerializationException: невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «System.Collections». .Generic.Dictionary`2[System.String,System.String]', поскольку для правильной десериализации этого типа требуется объект JSON (например, {имя:значение}). Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {name:value}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList)... Я не знаю что делать?   -  person RasRakaras    schedule 03.01.2021