如何将YAML转换为JSON

本文关键字:JSON 转换 YAML | 更新日期: 2023-09-27 17:50:05

我希望在YAML文件和JSON之间进行转换。很难找到关于

如何将YAML转换为JSON

的任何信息。

如果您不需要Json的特性。. NET,你也可以直接使用Serializer类来发出JSON:

// now convert the object to JSON. Simple!
var js = new Serializer(SerializationOptions.JsonCompatible);
var w = new StringWriter();
js.Serialize(w, o);
string jsonText = w.ToString();

你可以在这里检查两个工作的提琴:

  • 将YAML转换为JSON
  • 使用JSON将YAML转换为JSON。净

可以通过使用内置的JSON库和YamlDotNet来实现这一点。在YamlDotNet文档中没有明确说明,但我找到了一种相当简单的方法。

// convert string/file to YAML object
var r = new StreamReader(filename); 
var deserializer = new Deserializer(namingConvention: new CamelCaseNamingConvention());
var yamlObject = deserializer.Deserialize(r);
// now convert the object to JSON. Simple!
Newtonsoft.Json.JsonSerializer js = new Newtonsoft.Json.JsonSerializer();
var w = new StringWriter();
js.Serialize(w, yamlObject);
string jsonText = w.ToString();

我很惊讶这工作得这么好!JSON输出与其他基于web的工具相同。

下面使用YamlDotNet.Serialization的完整代码示例。示例是对象到YAML字符串和YAML字符串到对象。然后,您可以轻松地在。net中序列化和反序列化(封送和反封送)JSON。

使用内置System.Text.Json的示例:

https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/how-to?pivots=dotnet-7-0 serialization-example

如果你想在。net运行时为YAML提供一个基本序列化器,你可以在这里投票:

https://github.com/dotnet/runtime/issues/83313

然而,作为ASP上的@davidfowl。. NET团队指出:

https://www.nuget.org/packages/YamlDotNet是事实上的YAML.NET实现

https://github.com/dotnet/runtime/issues/83313 issuecomment - 1467411353

using System;
using System.Collections.Generic;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions;
public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
}
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public float HeightInInches { get; set; }
    public Dictionary<string, Address> Addresses { get; set; }
}
   
public class Program
{
    public static void Main()
    {
        var person = new Person
        {
            Name = "Abe Lincoln",
            Age = 25,
            HeightInInches = 6f + 4f / 12f,
            Addresses = new Dictionary<string, Address>{
                { "home", new  Address() {
                        Street = "2720  Sundown Lane",
                        City = "Kentucketsville",
                        State = "Calousiyorkida",
                        Zip = "99978",
                    }},
                { "work", new  Address() {
                        Street = "1600 Pennsylvania Avenue NW",
                        City = "Washington",
                        State = "District of Columbia",
                        Zip = "20500",
                    }},
            }
        };
        var serializer = new SerializerBuilder()
            .WithNamingConvention(CamelCaseNamingConvention.Instance)
            .Build();
        var yaml = serializer.Serialize(person);
        System.Console.WriteLine(yaml);
        // Output: 
        // name: Abe Lincoln
        // age: 25
        // heightInInches: 6.3333334922790527
        // addresses:
        //   home:
        //     street: 2720  Sundown Lane
        //     city: Kentucketsville
        //     state: Calousiyorkida
        //     zip: 99978
        //   work:
        //     street: 1600 Pennsylvania Avenue NW
        //     city: Washington
        //     state: District of Columbia
        //     zip: 20500
        var yml = @"
name: George Washington
age: 89
height_in_inches: 5.75
addresses:
  home:
    street: 400 Mockingbird Lane
    city: Louaryland
    state: Hawidaho
    zip: 99970
";
        var deserializer = new DeserializerBuilder()
            .WithNamingConvention(UnderscoredNamingConvention.Instance)
            .Build();
        //yaml contains a string containing your YAML
        var p = deserializer.Deserialize<Person>(yml);
        var h = p.Addresses["home"];
        System.Console.WriteLine($"{p.Name} is {p.Age} years old and lives at {h.Street} in {h.City}, {h.State}.");
        // Output:
        // George Washington is 89 years old and lives at 400 Mockingbird Lane in Louaryland, Hawidaho.
    }
}
源:

https://dotnetfiddle.net/CQ7ZKi

https://github.com/aaubry/YamlDotNet