[英]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.