2016-12-18 5 views
0

Я обходил это в течение нескольких дней и просто не могу получить эту работу. У меня есть файл YAML, который следует за следующим форматом (Примечание: я не могу изменить формат доставки, поскольку он является внешним). Я выбрал случайную тему, но структура такая же.Deserialize вложенной YAML с использованием YamlDotNEt и класса пользовательского типа в C#

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

ТАК!

Вопрос1: Какое имя я могу использовать или как я могу, чтобы список адресов был принят любым именем. В принципе, принимайте его из-за того, где он находится в структуре, а не по имени ключа.

Вопрос2: Я хочу записать имя ключа из «контейнера» этого адресаДата и сохранить его в поле postcode объекта addressData.

+0

мммм ...... что? –

+0

Забыл последний бит! – user3570798

+0

Вы попробовали 'Dictionary '? – flyx

ответ

1

Как указано @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();