在c#

时间:2016-12-18 22:21:53

标签: c# deserialization yaml yamldotnet

我已经在这里待了几天,但却无法实现这一目标。我有一个遵循以下格式的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;}
}

SO!

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

问题2:我想从容器中记录密钥名称&#39;将此addressData保存到addressData对象的邮政编码点。

1 个答案:

答案 0 :(得分:2)

提到@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();