1. はじめに
もし現代のAPIに触れたことがあるなら、webサービスやモバイルアプリを扱ったことがあるなら、あるいは「汎用フォーマット」で何か保存しようとしたことがあるなら — あなたは既に、あるいはこれからJSONに出会うでしょう。これは異なるプログラミング言語やプラットフォームを繋ぐフォーマットです:C#、JavaScript、Python — みんなJSONでやり取りします。
なぜJSONがシリアライズのスターになったか?理由は簡単:コンパクトで、人が読めて、軽量なテキストフォーマットだからです。人気の裏にはシンプルさ、汎用性、各言語の優れたサポートがあります。
JSONとは?
JSONはJavaScript Object Notationの略です。フォーマットはJavaScriptの世界から生まれましたが、すぐにブラウザの外へ広がりました。重要なのは、名前にJavaScriptが入っていても、JSONはJavaScriptに縛られず、どの言語でも便利に使える点です。
このフォーマットは2000年代初頭にダグラス・クロックフォードによって、冗長なXMLの代替として考案されました。アイデアは単純:「JSONは短い、シンプル、目で見て分かりやすい」。
2. JSONフォーマットの基本ルール
大事なこと:JSONは厳密に定義されたテキストフォーマットです。魔法はなく、ただのテキストなのでどんなエディタでも開けます。
基本的な構成要素:
- 配列 (arrays): 順序付きの値のリスト。
- オブジェクト (objects): キーと値のペアの集合。
- プリミティブ型: 文字列、数値、ブール値(true, false)と特別な値のnull。
最小限のJSONドキュメントの例:
{
"name": "イワン",
"age": 25,
"isStudent": true,
"scores": [5, 4, 5, 3],
"contacts": {
"email": "ivan@example.com",
"phone": null
}
}
概略の構造
C# の型と JSON 表現の対応表の簡単な例:
| C# 型 | JSON の例 |
|---|---|
|
|
|
|
|
|
| 配列 (int[], ...) | |
| オブジェクト (class, ...) | |
|
|
JSON記述のルール
- 文字列は常にダブルクォート: 'text' — エラー、正しくは "text"。
- オブジェクトのキーはダブルクォートの文字列であること:例えば "name": ...
- 要素間のみでカンマを使う。最後の要素の後のカンマは使わない。
- インデントは必須ではないが、可読性が上がる。
- 数値はクォートで囲まない:"age": 25、"age": "25" は誤り。
- ブールは true/false(クォート無し)、True や FALSE、あるいは "true" はダメ。
- null は null と書く(クォート無し)。
3. プログラマ目線のJSON
C# の型との類似点:
- JSONオブジェクト ≈ Dictionary<string, object>
- JSON配列 ≈ T[] または List<T>
- JSON文字列 ≈ 普通のstring
- JSON数値 ≈ int または double(値による)
オブジェクトをJSONにシリアライズする例
クラス:
public class Student
{
public string Name { get; set; } = "";
public int Age { get; set; }
public bool IsStudent { get; set; }
public int[] Scores { get; set; } = Array.Empty<int>();
}
生成されるJSON(簡略化、シリアライズの詳細は後述):
{
"Name": "イワン",
"Age": 25,
"IsStudent": true,
"Scores": [5, 4, 5, 3]
}
4. 有効なJSON構造の例
配列とネストしたオブジェクトを含むオブジェクト
{
"product": "コーヒー",
"price": 125.50,
"inStock": true,
"attributes": {
"weight": 500,
"unit": "g"
},
"tags": ["飲み物", "エネルギー", "アラビカ"],
"promotions": null
}
オブジェクトの配列
[
{"id": 1, "name": "ペーチャ"},
{"id": 2, "name": "マーシャ"},
{"id": 3, "name": "ヴァーシャ"}
]
5. 無効なJSONの例(とその理由)
シングルクォート:
{ 'name': 'イワン' } // エラー!
JSONはダブルクォートを要求します。
最後の要素の後のカンマ:
{ "x": 1, "y": 2, } // エラー!
末尾の余分なカンマは許されません。
コメント:
{
// 残念ながらJSONではこれは動きません
"name": "イワン"
}
JSONにはコメントがありません。
6. 実プロジェクトでJSONが必要な理由
システム間のデータ伝達
JSONは異なるアプリケーション間の共通言語で、たいていはHTTPの上で使われます。例えばサーバーがC#でフロントエンドがJavaScriptの場合、共通のフォーマットはJSONです。
設定やデータの保存
多くのアプリは設定を.jsonファイルに保存します。例えば appsettings.json は .NET アプリの標準です。利点:読みやすく、編集しやすく、バージョン管理しやすい。
サーバーとモバイルのAPI
大多数のREST APIはリクエスト/レスポンスのフォーマットとしてJSONを使います:例えばユーザー一覧はオブジェクトの配列として返ってきます。
ツールやライブラリの設定
多くの.NETツール(Serilog、Swaggerなど)は設定にJSONを使います。XMLはだんだん減り、JSONの方がコンパクトで分かりやすいです。
7. JSONの人気:なぜみんな好きなのか?
- 可読性。 プログラマでない人でも何が何だか分かる。
- ネットワーク転送に便利。 ただのテキストで、サイズも小さい。
- 全言語でのサポート。 シリアライズ/デシリアライズが簡単にできる。
- 設定ファイルに向いている。 どんなエディタでも扱いやすい。
- 生成が簡単。 JSONを作るのはとても簡単。
- 配列、ネスト、null。 直感的で、XMLのような余計な複雑さがない。
いつJSONを選ぶべきか?
- モバイルやウェブアプリを作っているとき;
- 外部サービスのAPIとやり取りするとき;
- 将来の統合を見据えて柔軟なアプリにしたいとき。
8. C#でのJSON操作
代表的な.NETライブラリを簡単に:
- System.Text.Json — 標準、速くてシンプル。
- Newtonsoft.Json (Json.NET) — 機能豊富なベテラン。
最小限のシリアライズ/デシリアライズの例:
using System.Text.Json;
// オブジェクトをJSON文字列に変換
var student = new Student { Name = "イワン", Age = 25, IsStudent = true, Scores = new[] {5, 4, 5, 3} };
string json = JsonSerializer.Serialize(student);
// 逆にJSON文字列からオブジェクトを読み取る
Student? parsed = JsonSerializer.Deserialize<Student>(json);
Console.WriteLine(json);
9. JSONで初心者がやりがちなミス
よくあるミスはクォートの混同やカンマの書き忘れです。コメントを追加しようとする人もいます(C#みたいで便利ですからね!)が、JSONは許しません。
もう一つよくあるのは、コレクションを初期化せずにシリアライズしてしまうこと:結果として期待した配列の代わりに "scores": null が出ることがあります。コレクションはあらかじめ初期化しておきましょう。
JSONはテキストだと覚えておいてください:大量データはメモリを大量に消費します。仮に500MBのデータをJSONでシリアライズすると、アプリのパフォーマンスに大きく影響します。
GO TO FULL VERSION