ウェブサイトを作ったり、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

かなり読みやすいですよね?それがポイントなんです。これを実現するルールを見ていきましょう。

構文ルール(シンプルです、約束します)

データ型: JSONには6つの構成要素があります:文字列(常にダブルクォートで囲む)、数値、ブーリアン(true/false)、null、オブジェクト、配列。それだけです — 日付型も、関数も、特殊な型もありません。

オブジェクト: キーと値のペアで、波括弧{}で囲みます。キーはダブルクォートで囲まれた文字列でなければなりません。ネストされたオブジェクトの例を見てみましょう:

json

配列: 角括弧[]で囲まれた順序付きリストです。あらゆる型の組み合わせを含めることができます:

json

一つ注意: 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ではありません:

json

2. 末尾のカンマ。 JavaScriptでは許可されていますが、JSONでは許可されていません:

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の最大の強みの一つは、あらゆる言語でのサポートです。人気の言語でのパースとシリアライズはこんな感じです:

javascript
python

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レスポンスの一般的なパターンです:

json

そして、よくあるエラーレスポンスのパターンです:

json

これらのパターンは非常に一般的で、よく設計されたほぼすべてのREST APIで見られます。このような慣習に従うことで、他の開発者にとってAPIが理解しやすくなります。

JSONクイックリファレンス

JSONドキュメントに入れられるすべてのもののチートシートです:

備考
String"hello"ダブルクォートを使用する必要がある
Number42, 3.14, -1, 2.5e10先頭のゼロ不可、16進数不可
Booleantrue, false小文字のみ
Nullnull小文字のみ
Object{"key": "value"}キーはクォートされた文字列である必要がある
Array[1, 2, 3]型を混在させることができる

自分で試してみよう

この知識を実践する準備はできましたか?ブックマークしておきたいツールはこちらです:

  • JSON Formatter — 整理されていないJSONを貼り付けて、適切なインデントで美しくフォーマットされた結果を得ましょう。
  • JSON Validator — JSONが構文的に正しいかすばやくチェックし、問題がある場合は明確なエラーメッセージを取得できます。
  • JSON Minifier — 本番ペイロード用にJSONからホワイトスペースを除去します。

JSONは表面的にはシンプルに見えるかもしれませんが、その癖やベストプラクティスをマスターすれば、デバッグにかかる無数の時間を節約できます。さあ、何か素晴らしいものを作りましょう!