繁体   English   中英

使用YamlDotNEt和C#中的自定义类型类反序列化嵌套的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

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

就像是:

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的“容器”中的键名,并将其保存到addressData对象的邮政编码中。

@flyx所述,您应该使用实现IDictionary<,>的类对addresses字段进行反序列化,因为它是一个映射。 最简单的解决方案是删除addressList类,而改用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而不是字符串。

另外,您可能希望指定一个命名约定,以便您的类可以遵循标准的.NET约定:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM