1

我已经解决了这几天,只是无法让它工作。我有一个遵循以下格式的 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 对象的邮政编码点。

4

1 回答 1

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;}
}

或者,您可以制作addressListimplement IDictionary<string, addressData>,但这将是更多的工作。

hasPets属性可能应该是 abool而不是字符串。

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

var deserializer = new DeserializerBuilder()
    .WithNamingConvention(new CamelCaseNamingConvention())
    .Build();
于 2016-12-19T11:15:48.207 回答