Я хочу десериализовать этот YAML с помощью YAMLDotNet.
Он имеет последовательность и вложенное сопоставление.
- data.yml
people:
- name: "John"
age: 20
- name: "Michael"
age: 21
- name: "William"
age: 22
network:
address: "192.168.1.1"
port: 1234
param:
paramNumber: 10
paramString: "text data"
paramBool: true
Это мой код. Но он не может скомпилироваться. Я хотел бы знать следующие две вещи.
- Как определить класс для десериализации вложенного сопоставления?
- Как получить к нему доступ?
- Печать десериализованных данных
DeserializedObject obj = YamlImporter.Deserialize("data.yml");
foreach(var people in obj.people)
{
Console.WriteLine(people.name);
Console.WriteLine(people.age);
}
Console.WriteLine(obj.network["address"]);
Console.WriteLine(obj.network["port"]);
/* how to access param? */
- Код десериализатора (YAMLDotNet)
public class YamlImporter
{
public static DeserializedObject Deserialize(string yamlName)
{
StreamReader sr = new StreamReader(yamlName);
string text = sr.ReadToEnd();
var input = new StringReader(text);
var deserializer = new DeserializerBuilder().WithNamingConvention(CamelCaseNamingConvention.Instance).Build();
DeserializedObject deserializeObject = deserializer.Deserialize<DeserializedObject>(input); /* compile error */
return deserializeObject;
}
}
public class DeserializedObject
{
public List<People> people { get; set; }
public class People
{
public string name { get; set; }
public int age { get; set; }
}
public Dictionary<string, Network> network { get; set; }
public class Network
{
public string address { get; set; }
public int port { get; set; }
public Dictionary<string, Param> param { get; set; }
}
public class Param
{
public int paramNumber { get; set; }
public string paramString { get; set; }
public bool paramBool { get; set; }
}
}
Спасибо,
Network.port
этоint
. Вы не можете индексировать вint
. - person Aluan Haddad   schedule 13.08.2020obj.port["port"]
->obj.network["port"]
- person ken   schedule 13.08.2020param
написано с ошибкой. Значение называетсяparams
в YAML.params
— это ключевое слово в C#. Вы можете использовать его как имя свойства, добавив к нему префикс@
:@params { get; set; }
. Я не знаю, как вы ожидали, что это сработает с неправильным именем. - person Aluan Haddad   schedule 13.08.2020@params
должен быть типаParams
,network
должен быть типаNetwork
- person Aluan Haddad   schedule 13.08.2020params
наparam
в YAML. Я думаю, что это может избежать ключевых слов. - person ken   schedule 14.08.2020@params
. Причина, по которой вы можете префиксировать зарезервированные слова в C#, заключается в том, чтобы обрабатывать взаимодействие с другими языками, что и происходит. Кроме того, поскольку вы используетеCamelCaseNamingConvention
, вы можете использовать PascalCase для всех ваших свойств C#, позволяя вашему коду соответствовать языковым соглашениям, еще одной функции взаимодействия, в данном случае предоставляемой библиотекой YAMLDotNet. - person Aluan Haddad   schedule 14.08.2020