Попытка преобразовать файл YAML в хеш-таблицу с помощью yamldotnet

Прямо сейчас я пытаюсь преобразовать файл YAML в хеш-таблицу, используя десериализатор, который предоставляется в библиотеке YamlDotNet. Получение ошибки Excpected 'SequenceStart' got 'MappingStart'.

var d = Deserializer();

var result = d.Deserialize<List<Hashtable>>(new StreamReader(*yaml path*));
foreach (var item in result)
{
    foreach (DictionaryEntry entry in item)
    {
        //print out using entry.Key and entry.Value and record
    }
}

Файловая структура YAML выглядит так

Title:

    Section1:
           Key1:    Value1
           Key2:    Value2
           Key3:    Value3

Иногда содержит более одного раздела.

Я пробовал решение, подобное этому Поиск руководства по чтению файлов .yaml с помощью С#, однако возникает та же ошибка. Как правильно прочитать файл YAML и преобразовать его в хэш с помощью YamlDotNet?


person FyreeW    schedule 12.07.2016    source источник


Ответы (1)


Вы пытаетесь десериализовать ввод YAML в виде списка:

d.Deserialize<List<Hashtable>>
//            ^^^^

Но самый верхний объект в вашем файле YAML — это сопоставление (начиная с Title:). Вот почему вы получаете ошибку.

Ваша структура имеет четыре уровня. Верхний уровень отображает строку (Title) на второй уровень. Второй уровень сопоставляет строку (Section1) с третьим уровнем. Третий уровень отображает строки (Key1) в строки (Value1).

Поэтому вы должны десериализовать что-то вроде:

Dictionary<string, Dictionary<string, Dictionary<string, string>>>

Если ваш самый верхний объект всегда имеет только одну пару ключ-значение (с Title в качестве ключа), вместо этого вы можете написать класс:

public class MyClass {
    public Dictionary<string, Dictionary<string, string>> Title { get; set; }
}

А затем используйте десериализацию для этого класса:

var result = d.Deserialize<MyClass>(new StreamReader(/* path */));
foreach (var section in result.Title) {
    Console.WriteLine("Section: " + section.Key);
    foreach (var pair in section.Value) {
        Console.WriteLine("  " + pair.Key + " = " + pair.Value);
    }
}
person flyx    schedule 13.07.2016