ウェブサイトを作ったり、APIを呼び出したり、package.jsonファイルを覗いたことがあるなら、すでにJSONに出会っています。JSONはJavaScript Object Notationの略で、アプリ同士がやり取りするための共通言語のようなものです。「JavaScript」という名前に惑わされないでください — JSONはほぼすべてのプログラミング言語で使えます。
わかりやすい言葉で、たくさんの例を交えながら解説していきましょう。
ちょっとした歴史の話
JSONは2000年代初頭にDouglas Crockfordによって作られました。ブラウザとサーバー間のデータ送受信に、XMLよりシンプルなものが欲しかったのです。このアイデアはすぐに広まり、2013年にECMA-404として、さらに2017年にはRFC 8259として正式に標準化されました。
現在、Web APIの90%以上がJSONを使用しています。JSONはなくなりません。
JSONはどんな見た目?
シンプルな例を見てみましょう — 人物を表すJSONオブジェクトです:
かなり読みやすいですよね?それがポイントなんです。これを実現するルールを見ていきましょう。
構文ルール(シンプルです、約束します)
データ型: JSONには6つの構成要素があります:文字列(常にダブルクォートで囲む)、数値、ブーリアン(true/false)、null、オブジェクト、配列。それだけです — 日付型も、関数も、特殊な型もありません。
オブジェクト: キーと値のペアで、波括弧{}で囲みます。キーはダブルクォートで囲まれた文字列でなければなりません。ネストされたオブジェクトの例を見てみましょう:
配列: 角括弧[]で囲まれた順序付きリストです。あらゆる型の組み合わせを含めることができます:
一つ注意: JSONでは末尾のカンマが許可されていません。{"name": "Sam",}はパーサーでエラーになります。JavaScriptから来た人がよくつまずくポイントです。JavaScriptでは末尾のカンマは全く問題ないのですから。
開発者がJSONを愛する理由
JSONがデータ形式の戦いに勝った理由はいくつかあります:
- とにかくシンプル。
{"name": "Jo"}をXMLのJoと比べてみてください。タイピングが少なく、ノイズも少ない。 - すべての言語がサポート。 Pythonには
json.loads()、JavaScriptにはJSON.parse()、Goにはencoding/jsonがあります。JavaScript側についてはMDNのJSONドキュメントを参照してください。 - 軽量。 JSONペイロードは通常、同等のXMLより30〜50%小さいです。1日に何百万ものAPIレスポンスを送信する場合、これは重要です。
- コードに自然にマッピングできる。 JSONオブジェクトは、Pythonの辞書、JavaScriptのオブジェクト、Rubyのハッシュとほぼ同じ見た目です。変換レイヤーは不要です。
JSONが活躍する場所
- Web API: ほぼすべてのREST APIにアクセスするとJSONが返ってきます。自分で試してみてください — ブラウザを開いて
https://api.github.com/users/octocatにアクセスしてみましょう。それがJSONです。 - 設定ファイル: Node.jsの
package.json、TypeScriptのtsconfig.json、VS Codeのsettings.json— JSONは開発者ツールのあらゆるところにあります。 - データベース: MongoDBはBSON(バイナリJSON)でデータを保存します。PostgreSQLにはネイティブのJSON列型があります。MySQLさえもJSONサポートを追加しました。
- データ交換: マイクロサービスは、ほぼ常にHTTP経由でJSON形式でやり取りします。
JSON vs XML — 簡単に言うと
XMLにはまだ居場所があります(詳しくはXMLの記事で)が、ほとんどのWeb開発作業では、可読性、ファイルサイズ、パース速度でJSONが勝っています。XMLが輝く唯一の分野は?混合コンテンツ、スキーマ、変換を含むドキュメント中心のデータです。
JSONのバリデーション
カンマの欠落、クォートの余分、末尾のカンマなど、小さなミスでもJSONパースは完全に失敗します。JSONには「部分的なパース」はありません。動くか動かないかのどちらかです。だからこそ、JSON FormatterやJSON Validatorのようなツールが便利なのです。JSONを貼り付ければ、問題があればすぐにわかります。
よくあるJSONのミス(とその修正方法)
何年もJSONを扱ってきた中で、開発者が何度も繰り返すミスをまとめました:
1. ダブルクォートの代わりにシングルクォートを使う。 これは有効なJavaScriptですが、有効なJSONではありません:
2. 末尾のカンマ。 JavaScriptでは許可されていますが、JSONでは許可されていません:
3. コメント。 JSONにはコメント構文がありません。設定ファイルにコメントが必要な場合は、JSONC(JSON with Comments、VS Codeでサポート)を検討するか、YAMLに切り替えましょう。
4. クォートなしのキー。 JavaScriptでは{name: "Sarah"}と書けますが、JSONではすべてのキーがクォートされた文字列でなければなりません:{"name": "Sarah"}。
5. undefinedの使用。 JavaScriptのundefinedはJSONには存在しません。代わりにnullを使いましょう。
さまざまな言語でJSONを扱う
JSONの最大の強みの一つは、あらゆる言語でのサポートです。人気の言語でのパースとシリアライズはこんな感じです:
APIがどれほど似ているか気づきましたか?読み込みはparse/loads、書き出しはstringify/dumps。ほとんどの言語がこの同じパターンに従っています。
JSONパフォーマンスのコツ
大きなJSONペイロードを扱うとき、パフォーマンスが重要になってきます。いくつかの実践的なコツを紹介します:
- 本番環境ではミニファイする。 JSONからホワイトスペースを除去すると、ファイルサイズを10〜30%削減できます。JSON Minifierならワンクリックでできます。
- 大きなファイルにはストリーミングパーサーを使う。 JSONファイルが数百メガバイトある場合、すべてをメモリに読み込まないでください。
JSONStream(Node.js)やijson(Python)のようなライブラリはインクリメンタルにパースします。 - 深いネスト構造は避ける。 ネストの各レベルがパースのオーバーヘッドを増加させます。4〜5レベル以上ネストしている場合は、データモデルのフラット化を検討しましょう。
- 極端なケースにはバイナリ代替手段を検討する。 非常に高スループットのシステムでは、MessagePack、BSON、Protocol Buffersのようなフォーマットが2〜5倍小さいペイロードと高速なパースを提供できます。ただし、人間の可読性が失われるため、トレードオフです。
実際のAPI設計におけるJSON
実際のAPIがJSONレスポンスをどう構造化しているか見てみましょう。ページネーション付きAPIレスポンスの一般的なパターンです:
そして、よくあるエラーレスポンスのパターンです:
これらのパターンは非常に一般的で、よく設計されたほぼすべてのREST APIで見られます。このような慣習に従うことで、他の開発者にとってAPIが理解しやすくなります。
JSONクイックリファレンス
JSONドキュメントに入れられるすべてのもののチートシートです:
| 型 | 例 | 備考 |
| String | "hello" | ダブルクォートを使用する必要がある |
| Number | 42, 3.14, -1, 2.5e10 | 先頭のゼロ不可、16進数不可 |
| Boolean | true, false | 小文字のみ |
| Null | null | 小文字のみ |
| Object | {"key": "value"} | キーはクォートされた文字列である必要がある |
| Array | [1, 2, 3] | 型を混在させることができる |
自分で試してみよう
この知識を実践する準備はできましたか?ブックマークしておきたいツールはこちらです:
- JSON Formatter — 整理されていないJSONを貼り付けて、適切なインデントで美しくフォーマットされた結果を得ましょう。
- JSON Validator — JSONが構文的に正しいかすばやくチェックし、問題がある場合は明確なエラーメッセージを取得できます。
- JSON Minifier — 本番ペイロード用にJSONからホワイトスペースを除去します。
JSONは表面的にはシンプルに見えるかもしれませんが、その癖やベストプラクティスをマスターすれば、デバッグにかかる無数の時間を節約できます。さあ、何か素晴らしいものを作りましょう!