[C#] 初探 YAML ,序列化反序列化,跟 JSON 轉換

2021-02-03

簡單的說最近要用到所以就簡單看了一下,其實蠻簡單大概就是分享一下 這次我使用的是 YamlDotNet , 網路上看其他人寫關於 YAML +C# 文章是用 NetEscapades ( https://marcus116.blogspot.com/2019/06/netcore-aspnet-core-yaml.html ) ,其實我只是挑下載排名高的 : P ,我是覺得差異應該不大,等有時間再測試看看

事先作業 記得先安裝 YamlDotNet -  https://www.nuget.org/packages/YamlDotNet/

1. 序列化 :

var user1 = new User { Name = "Donma", Age = 20, Birth = DateTime.Now, Key = "Key1", Salary = 1999.987654321m }; user1.Friends = new System.Collections.Generic.List<User>(); user1.Friends.Add(new User { Name = "Donma Friend1", Age = 29, Birth = DateTime.Today, Key = "Key2", Salary = 2999.29000000m }); var serializer = new YamlDotNet.Serialization.SerializerBuilder().Build(); var yamlString1 = serializer.Serialize(user1); Console.WriteLine(yamlString1); Key: Key1 Name: Donma Salary: 1999.987654321 Birth: 2021-02-03T11:24:47.2097392+08:00 Age: 20 Friends: - Key: Key2 Name: Donma Friend1 Salary: 2999.29000000 Birth: 2021-02-03T00:00:00.0000000+08:00 Age: 29 Friends: public class User { public string Key { get; set; } public string Name { get; set; } public decimal? Salary { get; set; } public DateTime Birth { get; set; } public int Age { get; set; } public List<User> Friends { get; set; } }

2. 反序列化:

var deSerializer = new YamlDotNet.Serialization.DeserializerBuilder().Build(); var user2=deSerializer.Deserialize<User>(yamlString1); Console.WriteLine(user2.Key+","+user2.Name+","+user2.Friends.Count); //Result //Key1,Donma,1

3. JSON 轉 YAML -透過 JSON.net 轉換物件,我看過其他人用其他方法轉,因為我講求偷懶? 這方法可能不是很好,但是簡單有效,不好的點是在於會透過一次反序列化後再轉成 YAML,我有稍微改一下結構證明 ExpandoObject 是有效的。

var json1String = "{\"KeyTest\":\"Key1\",\"NameTest\":\"Donma\",\"SalaryTest\":1999.987654321,\"BirthTest\":\"2021-02-03T11:09:04.6288423+08:00\",\"AgeTest\":20," + "\"Friends\":[{\"Key\":\"Key2\",\"Name\":\"Donma Friend1\",\"Salary\":2999.29000000,\"Birth\":\"2021-02-03T00:00:00+08:00\",\"Age\":29," + "\"Friends\":null}]}"; var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpandoObject>(json1String); var yamlString2 = serializer.Serialize(obj); Console.WriteLine(yamlString2); //Result /* KeyTest: Key1 NameTest: Donma SalaryTest: 1999.987654321 BirthTest: 2021-02-03T11:09:04.6288423+08:00 AgeTest: 20 Friends: - Key: Key2 Name: Donma Friend1 Salary: 2999.29 Birth: 2021-02-03T00:00:00.0000000+08:00 Age: 29 Friends: */


簡單筆記一下,基本上就是跟 JSON 一樣是一種格式,在某些狀況他的封包量可能會更小..


當麻許的碎念筆記 2014 | Donma Hsu Design.