【C#】JSONとYAMLの相互変換

【C#】JSONとYAMLの相互変換

Newtonsoft.JsonとYamlDotNetを使用したJSONとYAMLの相互変換方法を記載します。


<確認環境>
Windows10 64bit
Visual Studio 2022
.NET6.0
Newtonsoft.Json v13.0.3
YamlDotNet v13.0.2

Newtonsoft.Jsonとは

Newtonsoft.JsonはJSONを取り扱うためのオープンソースのライブラリです。.NET Frameworkおよび.NETCoreで使用できます。ライセンスはMITで提供されます。
https://www.newtonsoft.com/json

YamlDotNetとは

YamlDotNetはYAMLを取り扱うためのオープンソースのライブラリです。.NET Frameworkおよび.NETCoreで使用できます。ライセンスはMITで提供されます。
https://github.com/aaubry/YamlDotNet

インストール

Newtonsoft.JsonとYamlDotNetをインストールします。


Newtonsoft.Jsonのインストール

Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択して以下のコマンドを実行します。
Install-Package Newtonsoft.Json

または、[プロジェクト] > [NuGet パッケージ管理] でNewtonsoft.Jsonを検索してインストールします。
Newtonsoft.Jsonのインストール


YamlDotNetのインストール

Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択して以下のコマンドを実行します。

Install-Package YamlDotNet

または、[プロジェクト] > [NuGet パッケージ管理] でYamlDotNetを検索してインストールします。
YamlDotNetのインストール


JSONからYAMLに変換

JSON形式の文字列からYAML形式の文字列へ変換する例を記載します。


データ格納クラスを使用した変換

JSON形式の文字列のオブジェクトに変換するため、JSONの内容とあわせたプロパティを定義したデータ格納クラスを作成します。
JSON形式の文字列からJsonConvert.DeserializeObject()を使用して、データ格納クラスに変換します。そのあと、データ格納クラスからYAML形式の文字列に変換します。

コード
using Newtonsoft.Json;
using YamlDotNet.Serialization;

// JSON形式の文字列
var json = @"
{
    ""Name"":""ピカチュウ"",
    ""Abilities"":[""でんきショック"",""ボルテッカー""],
    ""Parameter"":{""HP"":70,""ATK"":50,""DEF"":20}
}";

// JSON形式の文字列をデータ格納クラスに変換する
var obj = JsonConvert.DeserializeObject<Pokemon>(json);

// データ格納クラスをYAML形式の文字列に変換する
var serializer = new SerializerBuilder().Build();
var yaml = serializer.Serialize(obj);

// 変換結果の出力
Console.WriteLine(yaml);

// データ格納クラス
public class Pokemon
{
    public string Name { get; set; }
    public string[] Abilities { get; set; }
    public Parameter Parameter { get; set; }
}
public class Parameter
{
    public int HP { get; set; }
    public int ATK { get; set; }
    public int DEF { get; set; }
}

変換結果の出力
Name: ピカチュウ
Abilities:
- でんきショック
- ボルテッカー
Parameter:
  HP: 70
  ATK: 50
  DEF: 20

ExpandoObjectクラスを使用した変換

JSON形式の文字列からExpandoObjectクラスに変換します。そのあと、ExpandoObjectクラスからYAML形式の文字列に変換します。
ExpandoObjectクラスは静的クラスや事前定義された型を作成することなく、動的にオブジェクトを作成できます。

コード

using System.Dynamic;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using YamlDotNet.Serialization;

// JSON形式の文字列
var json = @"
{
    ""Name"":""ピカチュウ"",
    ""Abilities"":[""でんきショック"",""ボルテッカー""],
    ""Parameter"":{""HP"":70,""ATK"":50,""DEF"":20}
}";

// JSON形式の文字列をExpandoObjectクラスに変換する
var converter = new ExpandoObjectConverter();
var obj = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);

// ExpandoObjectクラスをYAML形式の文字列に変換する
var serializer = new SerializerBuilder().Build();
var yaml = serializer.Serialize(obj);

// 変換結果の出力
Console.WriteLine(yaml);

変換結果の出力

Name: ピカチュウ
Abilities:
- でんきショック
- ボルテッカー
Parameter:
  HP: 70
  ATK: 50
  DEF: 20

YAMLからJSONに変換

YAML形式の文字列をJSON形式の文字列に変換する例を記載します。


オブジェクトクラスを使用した変換

YAML形式の文字列からオブジェクトクラスに変換します。そのあと、オブジェクトクラスからJSON形式の文字列に変換します。
JsonConvert.SerializeObject()でFormatting.Indentedを指定すると、JSON文字列が見やすく改行されます。

コード
using Newtonsoft.Json;
using YamlDotNet.Serialization;

// YAML形式の文字列
var yaml = @"
Name: ピカチュウ
Abilities:
  - でんきショック
  - ボルテッカー
Parameter:
  HP: 70
  ATK: 50
  DEF: 20";

using (var reader = new StringReader(yaml))
{
    // YAML形式の文字列をオブジェクトクラスに変換する
    var deserializer = new DeserializerBuilder().Build();
    var obj = deserializer.Deserialize(reader);

    // オブジェクトクラスをJSON形式の文字列に変換する
    var json = JsonConvert.SerializeObject(obj, Formatting.Indented);
    
    // 変換結果の出力
    Console.WriteLine(json);
}

変換結果の出力
{
  "Name": "ピカチュウ",
  "Abilities": [
    "でんきショック",
    "ボルテッカー"
  ],
  "Parameter": {
    "HP": "70",
    "ATK": "50",
    "DEF": "20"
  }
}

JsonCompatibleを使用した変換

YAML形式の文字列からオブジェクトクラスに変換します。そのあと、YamlDotNetシリアライズでJsonCompatibleを使用して1行のJSON形式文字列に変換します。
JSON形式の文字列が1行では見づらいため、JObject.Parse()を使用して改行文字列に変換して出力します。
こちらの例は、Newtonsoft.JsonをインストールせずにJSON形式に変換することができます。

コード
using YamlDotNet.Serialization;

// YAML形式の文字列
var yaml = @"
Name: ピカチュウ
Abilities:
  - でんきショック
  - ボルテッカー
Parameter:
  HP: 70
  ATK: 50
  DEF: 20";

using (var reader = new StringReader(yaml))
{
    // YAML形式の文字列をオブジェクトに変換する
    var deserializer = new DeserializerBuilder().Build();
    var obj = deserializer.Deserialize(reader);

    // オブジェクトを1行のJSON形式の文字列に変換する
    var serializer = new SerializerBuilder().JsonCompatible().Build();
    var json = serializer.Serialize(obj);

    // JSON形式の文字列を改行するためJObjectに変換
    var jobj = JObject.Parse(json);
    // 変換結果の出力
    Console.WriteLine(jobj.ToString());
}

変換結果の出力
{
  "Name": "ピカチュウ",
  "Abilities": [
    "でんきショック",
    "ボルテッカー"
  ],
  "Parameter": {
    "HP": "70",
    "ATK": "50",
    "DEF": "20"
  }
}


Next Post Previous Post