使用 YamlDotNet 反序列化 FontAwesome Yaml
Deserialize FontAwesome Yaml Using YamlDotNet
我有一个 Yaml 文件:
https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/src/icons.yml
还有一个class:
public class IconSearch
{
public string Name { get; set; }
public string ClassName { get; set; }
public IEnumerable<string> Filters { get; set; }
}
你能告诉我如何将 yaml 反序列化为 IEnumerable 对象吗?
我希望这样的东西可以工作,但它 returns 无效 - 我猜这是因为我的属性之一不是根节点(图标)。相反,我正在尝试序列化根的子项?
var input = new StringReader(reply);
var yaml = new YamlStream();
yaml.Load(input);
var icons = deserializer.Deserialize<IconSearch>(input);
您尝试反序列化的 class 似乎缺少属性。
我四处寻找将 yaml 转换为 json 到 csharp 的方法,这是生成的 class:
public class Rootobject
{
public Icon[] icons { get; set; }
}
public class Icon
{
public string[] categories { get; set; }
public object created { get; set; }
public string[] filter { get; set; }
public string id { get; set; }
public string name { get; set; }
public string unicode { get; set; }
public string[] aliases { get; set; }
public string[] label { get; set; }
public string[] code { get; set; }
public string url { get; set; }
}
使用的资源:
YAML to JSON online
JSON to CSHARP(我在 visual studio 中使用了选择性粘贴)
用这个反序列化
var icons = deserializer.Deserialize<RootObject>(input);
更新
我已经注释掉了您用来创建 YamlStream 的行,因为它不是必需的(它将 reader 定位到流的末尾而不是开始,这可以解释为什么您之前得到 null )。您的主要方法如下所示并且有效。我还修复了 Antoine 提到的错误
public static void Main()
{
string filePath = "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/src/icons.yml";
WebClient client = new WebClient();
string reply = client.DownloadString(filePath);
var input = new StringReader(reply);
//var yamlStream = new YamlStream();
//yamlStream.Load(input);
Deserializer deserializer = new Deserializer();
//var icons = deserializer.Deserialize<IconSearch>(input);
//Testing my own implementation
//if (icons == null)
// Console.WriteLine("Icons is null");
//Testing Shekhar's suggestion
var root = deserializer.Deserialize<Rootobject>(input);
if (root == null)
Console.WriteLine("Root is null");
}
我有一个 Yaml 文件: https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/src/icons.yml
还有一个class:
public class IconSearch
{
public string Name { get; set; }
public string ClassName { get; set; }
public IEnumerable<string> Filters { get; set; }
}
你能告诉我如何将 yaml 反序列化为 IEnumerable 对象吗?
我希望这样的东西可以工作,但它 returns 无效 - 我猜这是因为我的属性之一不是根节点(图标)。相反,我正在尝试序列化根的子项?
var input = new StringReader(reply);
var yaml = new YamlStream();
yaml.Load(input);
var icons = deserializer.Deserialize<IconSearch>(input);
您尝试反序列化的 class 似乎缺少属性。 我四处寻找将 yaml 转换为 json 到 csharp 的方法,这是生成的 class:
public class Rootobject
{
public Icon[] icons { get; set; }
}
public class Icon
{
public string[] categories { get; set; }
public object created { get; set; }
public string[] filter { get; set; }
public string id { get; set; }
public string name { get; set; }
public string unicode { get; set; }
public string[] aliases { get; set; }
public string[] label { get; set; }
public string[] code { get; set; }
public string url { get; set; }
}
使用的资源:
YAML to JSON online
JSON to CSHARP(我在 visual studio 中使用了选择性粘贴)
用这个反序列化
var icons = deserializer.Deserialize<RootObject>(input);
更新
我已经注释掉了您用来创建 YamlStream 的行,因为它不是必需的(它将 reader 定位到流的末尾而不是开始,这可以解释为什么您之前得到 null )。您的主要方法如下所示并且有效。我还修复了 Antoine 提到的错误
public static void Main()
{
string filePath = "https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/src/icons.yml";
WebClient client = new WebClient();
string reply = client.DownloadString(filePath);
var input = new StringReader(reply);
//var yamlStream = new YamlStream();
//yamlStream.Load(input);
Deserializer deserializer = new Deserializer();
//var icons = deserializer.Deserialize<IconSearch>(input);
//Testing my own implementation
//if (icons == null)
// Console.WriteLine("Icons is null");
//Testing Shekhar's suggestion
var root = deserializer.Deserialize<Rootobject>(input);
if (root == null)
Console.WriteLine("Root is null");
}