Json.NET (Newtonsoft.Json) と dynamic
を使うと C# でも動的に変化する JSON を扱えます。
環境
- Visual Studio 2017
- .NET Core 2.2
基礎知識
オブジェクトは JObject
、配列は JArray
という型で扱うようです。
オブジェクトのデシリアライズ
JObject.Parse
でデシリアライズを行います。
string json = @"{
'Name': 'Foo',
'Age': 20,
'Favorites':[
'Baseball',
'Music'
]
}";
dynamic person = JObject.Parse(json);
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(string.Join(',', person.Favorites));
実行結果
Foo
20
Baseball,Music
プロパティの追加
JObject
の Add
メソッドで追加できます。
string json = @"{
'Name': 'Foo',
'Age': 20,
'Favorites':[
'Baseball',
'Music'
]
}";
dynamic person = JObject.Parse(json);
// プロパティの追加
person.Add("Country", "Japan");
// シリアライズして中身を確認
Console.WriteLine(JsonConvert.SerializeObject(person, Formatting.Indented));
実行結果
{
"Name": "Foo",
"Age": 20,
"Favorites": [
"Baseball",
"Music"
],
"Country": "Japan"
}
配列のデシリアライズ
JArray.Parse
でデシリアライズを行います。
string json = @"[
{
'Name': 'Foo',
'Age': 20,
'Favorites':[
'Baseball',
'Music'
]
},
{
'Name': 'Bar',
'Age': 30,
'Favorites':[
'Soccer',
'Movie'
]
},
]";
dynamic persons = JArray.Parse(json);
// person は JObject 型
foreach (var person in persons)
{
Console.WriteLine(person.Name);
Console.WriteLine(person.Age);
Console.WriteLine(string.Join(',', person.Favorites));
}
実行結果
Foo
20
Baseball,Music
Bar
30
Soccer,Movie
要素の追加
JArray
の Add
メソッドで追加できます。
string json = @"{
'Name': 'Foo',
'Age': 20,
'Favorites':[
'Baseball',
'Music'
]
}";
dynamic person = JObject.Parse(json);
// 要素の追加(person.Favorites は JArray 型)
person.Favorites.Add("Ski");
// シリアライズして中身を確認
Console.WriteLine(JsonConvert.SerializeObject(person, Formatting.Indented));
実行結果
{
"Name": "Foo",
"Age": 20,
"Favorites": [
"Baseball",
"Music",
"Ski"
]
}