尝试使用 yamldotnet 将 YAML 文件转换为哈希表

本文关键字:文件 转换 哈希表 YAML yamldotnet | 更新日期: 2023-09-27 17:56:33

现在我正在尝试利用YamlDotNet库中提供的反序列化程序将YAML文件转换为哈希表。获取错误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

有时包含多个部分。

我也尝试了类似于此寻求指南的解决方案,也可以使用 C# 读取 .yaml 文件,但是发生了相同的错误。如何正确读取 YAML 文件,并使用 YamlDotNet 将其转换为哈希?

尝试使用 yamldotnet 将 YAML 文件转换为哈希表

您正在尝试将 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);
    }
}