在 c# 中使用 YamlDotNEt 和自定义类型 class 反序列化嵌套 YAML

Deserialize nested YAML using YamlDotNEt and custom type class in c#

几天来我一直在研究这个问题,就是无法正常工作。我有一个遵循以下格式的 YAML 文件(请注意,我无法更改交付格式,因为它是外部格式)。我选了一个随机主题,但结构是一样的。

gender: male
age: 21
eyes: blue
lastLogins:
- 12/12/2016
- 14/12/2016
- 15/12/2016
addresses:
   po011aa:
      streetAddress: 1 the road
      phoneNumber: 0118123123456
   po21bb:
      streetAddress: 1 another road
      phoneNunder: 012345643556
hasPets: true

我创建了一个自定义 class 以在反序列化时包含此数据。

类似于:

public class person
{
public string gender {get; set;}
public string age {get; set;}
public string eyes {get; set;}
public List<string> lastLogins {get; set;}
public addressList addresses {get; set;}
public string hasPets {get; set;}
}

public class addressList
{
public List<addressData> **QUESTION1** {get; set;}
}

public class addressData
{
public string postCost {get; set;} **QUESTION2**
public string streetAddress {get; set;}
public string phoneNumber {get; set;}
}

太棒了!

问题 1:我可以使用什么名称,或者我怎样才能让 addressData 列表接受任何名称。基本上接受它是因为它在结构中的位置而不是键的名称。

问题2:我想从这个addressData 的'container' 中记录键名并将其保存到addressData 对象的邮编位置。

所述,您应该使用实现 IDictionary<,> 的 class 来反序列化 addresses 字段,因为它是一个映射。最简单的解决方案是删除 addressList class 并改用 Dictionary<string, addressData>

public class person
{
    public string gender {get; set;}
    public string age {get; set;}
    public string eyes {get; set;}
    public List<string> lastLogins {get; set;}
    public Dictionary<string, addressData> addresses {get; set;}
    public string hasPets {get; set;}
}

public class addressData
{
    public string postCost {get; set;}
    public string streetAddress {get; set;}
    public string phoneNumber {get; set;}
}

或者,您可以让 addressList 实现 IDictionary<string, addressData>,但那样会更麻烦。

hasPets 属性 应该是 bool 而不是字符串。

另外,您可能想要指定一个命名约定,以便您的 classes 可以遵循标准的 .NET 约定:

var deserializer = new DeserializerBuilder()
    .WithNamingConvention(new CamelCaseNamingConvention())
    .Build();