2016-12-18 26 views
0

我一直在绕过这几天,只是不能得到这个工作。我有一个遵循以下格式的YAML文件(请注意,由于它是外部格式,因此无法更改传送格式)。我选择了一个随机主题,但结构相同。反序列化使用YamlDotNEt和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:
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:我想从这个addressData的'容器'中记录键名,并将其保存到addressData对象的postcode中。

+0

MMMM ......什么? –

+0

忘记了最后一点! – user3570798

+0

你试过了一个'Dictionary '吗? – flyx

回答

1

由于@flyx提到,您应该使用一个实现IDictionary<,>来反序列化addresses字段的类,因为is是映射。最简单的解决方案是删除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(); 
相关问题