在 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();
几天来我一直在研究这个问题,就是无法正常工作。我有一个遵循以下格式的 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();