【C#】JSONとYAMLの相互変換
Newtonsoft.JsonとYamlDotNetを使用したJSONとYAMLの相互変換方法を記載します。
<確認環境>
Windows10 64bit
Visual Studio 2022
.NET6.0
Newtonsoft.Json v13.0.3
YamlDotNet v13.0.2
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
https://www.newtonsoft.com/json
YamlDotNetとは
YamlDotNetはYAMLを取り扱うためのオープンソースのライブラリです。.NET Frameworkおよび.NETCoreで使用できます。ライセンスはMITで提供されます。
https://github.com/aaubry/YamlDotNet
https://github.com/aaubry/YamlDotNet
インストール
Newtonsoft.JsonとYamlDotNetをインストールします。
Newtonsoft.Jsonのインストール
Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択して以下のコマンドを実行します。
Install-Package Newtonsoft.Json
または、[プロジェクト] > [NuGet パッケージ管理] でNewtonsoft.Jsonを検索してインストールします。
YamlDotNetのインストール
Visual Studio のメニューから[ツール] > [NuGet パッケージマネージャー] > [パッケージマネージャーコンソール] を選択して以下のコマンドを実行します。
Install-Package YamlDotNet
または、[プロジェクト] > [NuGet パッケージ管理] でYamlDotNetを検索してインストールします。
JSONからYAMLに変換
JSON形式の文字列からYAML形式の文字列へ変換する例を記載します。
データ格納クラスを使用した変換
JSON形式の文字列のオブジェクトに変換するため、JSONの内容とあわせたプロパティを定義したデータ格納クラスを作成します。
JSON形式の文字列からJsonConvert.DeserializeObject()を使用して、データ格納クラスに変換します。そのあと、データ格納クラスからYAML形式の文字列に変換します。
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クラスは静的クラスや事前定義された型を作成することなく、動的にオブジェクトを作成できます。
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文字列が見やすく改行されます。
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形式に変換することができます。
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"
}
}