Десериализовать вложенный 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: Я хочу записать имя ключа из «контейнера» этих адресных данных и сохранить его в месте почтового индекса объекта addressData.


person user3570798    schedule 18.12.2016    source источник
comment
Забыл последний бит!   -  person user3570798    schedule 19.12.2016
comment
Вы пробовали Dictionary<string, addressList> ?   -  person flyx    schedule 19.12.2016


Ответы (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();
person Antoine Aubry    schedule 19.12.2016