現代のアプリケーション開発においてJSONは、データの受け渡しや保存に欠かせないフォーマットです。C#を使ってWeb APIと連携する際や、設定ファイルを読み込む際にもJSONはよく使われます。しかし、初めて扱う方には「どうやって読み書きするの?」と迷うこともあるでしょう。この記事では、C#でJSONを扱う基本的な方法から、応用的なテクニックまで、初心者にもわかりやすくサンプルコード付きで解説します。Visual Studioを使ってすぐに試せる内容になっているので、ぜひ手を動かしながら学んでみてください。
JSONとは?簡単なおさらい
JSON(JavaScript Object Notation)は、データをキーと値のペアで表す軽量なデータフォーマットです。以下のような形式で表現されます。
{
"name": "山田太郎",
"age": 30,
"isMember": true
}
テキスト形式のため、人間が読みやすく、なおかつプログラムでも解析しやすいという特徴があります。C#では、このJSONを「シリアライズ(オブジェクト → JSON文字列)」と「デシリアライズ(JSON文字列 → オブジェクト)」することで扱います。
C#でJSONを扱うための準備
C#でJSONを扱うには主に以下の2つの方法があります。
- System.Text.Json(.NET Core 3.0以降の標準)
- Newtonsoft.Json(Json.NET)という外部ライブラリ
この記事では、まず標準の System.Text.Json
を中心に解説し、後半で Newtonsoft.Json
も紹介します。
必要な準備は次の通りです。
- .NET 6以上のプロジェクト(Visual Studio推奨)
- JSONを格納するためのクラス定義
JSONの読み込み(デシリアライズ)
まずは、JSON文字列をC#のオブジェクトに変換する方法です。
1. クラスを定義する
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsMember { get; set; }
}
2. JSON文字列を読み込む
using System.Text.Json;
string json = @"{ ""Name"": ""山田太郎"", ""Age"": 30, ""IsMember"": true }";
User user = JsonSerializer.Deserialize<User>(json);
Console.WriteLine(user.Name); // 山田太郎
JsonSerializer.Deserialize<T>()
メソッドで、JSON文字列を指定のクラスに変換できます。
JSONの書き出し(シリアライズ)
オブジェクトをJSON文字列に変換する方法です。
User user = new User
{
Name = "佐藤花子",
Age = 25,
IsMember = false
};
string json = JsonSerializer.Serialize(user);
Console.WriteLine(json);
// {"Name":"佐藤花子","Age":25,"IsMember":false}
このように、JsonSerializer.Serialize()
を使えば、すぐにJSON形式に変換可能です。
JSONファイルの読み書き
JSONをファイルに保存したり、ファイルから読み込んだりするのも簡単です。
JSONファイルの保存
File.WriteAllText("user.json", JsonSerializer.Serialize(user));
JSONファイルの読み込み
string fileContent = File.ReadAllText("user.json");
User userFromFile = JsonSerializer.Deserialize<User>(fileContent);
ファイル操作には System.IO
名前空間が必要です。
Newtonsoft.Jsonを使った方法(Json.NET)
.NET Framework
やより多機能な操作を行いたい場合は、Newtonsoft.Json
がおすすめです。
NuGetパッケージのインストール
Visual Studioで以下のコマンドを使うか、NuGet GUIからインストールします。
Install-Package Newtonsoft.Json
使用例(デシリアライズ)
using Newtonsoft.Json;
string json = @"{ ""Name"": ""田中一郎"", ""Age"": 40, ""IsMember"": true }";
User user = JsonConvert.DeserializeObject<User>(json);
Console.WriteLine(user.Name); // 田中一郎
使用例(シリアライズ)
string output = JsonConvert.SerializeObject(user, Formatting.Indented);
Console.WriteLine(output);
Formatting.Indented
を指定することで、見やすい整形されたJSONに変換できます。
JSON配列の扱い方
複数のオブジェクトを扱うJSON配列もよく使われます。
[
{ "Name": "山田", "Age": 28, "IsMember": true },
{ "Name": "佐藤", "Age": 34, "IsMember": false }
]
これを List<User>
に変換するには:
string jsonArray = File.ReadAllText("users.json");
List<User> users = JsonSerializer.Deserialize<List<User>>(jsonArray);
foreach (var user in users)
{
Console.WriteLine($"{user.Name} ({user.Age})");
}
応用:匿名型や辞書型での扱い
型がわからないJSONを柔軟に扱いたい場合、以下のように Dictionary<string, object>
で受け取る方法があります(Newtonsoft.Json使用)。
var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
Console.WriteLine(data["Name"]);
または、dynamic
を使って柔軟にアクセスも可能です。
dynamic obj = JsonConvert.DeserializeObject(json);
Console.WriteLine(obj.Name);
よくあるエラーと対処法
クラスのプロパティ名が一致しない
デフォルトでは、C#のプロパティ名とJSONのキー名が一致している必要があります。違う場合は属性を付けましょう。
public class User
{
[JsonPropertyName("full_name")] // System.Text.Jsonの場合
public string Name { get; set; }
}
DateTime型の扱いに注意
標準のJSONライブラリでは、日付フォーマットに制限があるため、日付型を扱う際にはフォーマットに注意が必要です。
まとめ
C#でJSONを扱うには、標準の System.Text.Json
を使えば簡単にシリアライズ/デシリアライズが可能です。より柔軟な操作が必要な場合は Newtonsoft.Json
を使うとよいでしょう。JSONの扱いは現代の開発において必須スキルなので、ぜひ本記事のサンプルを参考に、実際にコードを書いて感覚を掴んでみてください。