2016-12-18 50 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(); 
相關問題