プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2020/01/09

[C#] 動的な JSON を扱う

event_note2020/01/08 23:07

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

プロパティの追加

JObjectAdd メソッドで追加できます。

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

要素の追加

JArrayAdd メソッドで追加できます。

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"
  ]
}