JSON入門:書き方・データ型・エラーの直し方
2026年11月更新
JSON(JavaScript Object Notation)は、構造を持ったデータを表すテキスト形式です。もともとはJavaScriptのオブジェクト記法の一部として生まれましたが、今ではほぼすべてのプログラミング言語がJSONを読み書きでき、Web API、多くの設定ファイル、数え切れないほどのデータのエクスポートで標準的な形式になっています。ルールは1ページに収まるほど短いものの、カンマが1つ多い、引用符の種類が違うといった小さなミス1つで、文書全体がプログラムに読めなくなります。このガイドでは、ルール、データ型、よく出会うエラーとその直し方を説明します。
JSONの見た目
JSONの文書は、1つの値でできています。たいていその値は波かっこで囲んだオブジェクトか、角かっこで囲んだ配列で、その中に別の値が入ります。
{"name": "山田花子", "age": 31, "languages": ["日本語", "英語"], "manager": null}
ルールはシンプルです。
- オブジェクトは
{ }の中に名前と値の組を入れます。名前(キー)はダブルクォートで囲んだ文字列で、そのあとにコロンと値が続きます。 - 配列は
[ ]の中に値を順番に並べます。1つの配列に異なる型の値を混ぜてもかまいません。 - 要素はカンマで区切り、最後の要素のあとにはカンマを付けません。
- 文字列にはダブルクォートだけを使います。文字列の中では、ダブルクォートを
\"、バックスラッシュを\\、改行を\nと書きます。 - 要素の間のスペース、タブ、改行は無視されるので、同じデータを1行で書いても、複数行に分けて書いてもかまいません。
- コメント、変数、関数はありません。JSONはデータだけを表します。
JSONは、内容が一致する2つの標準、ECMA-404とRFC 8259で定められています。RFC 8259では、システム間でやり取りするJSONはUTF-8でエンコードすることになっているため、日本語、한국어、絵文字などもそのまま入れられます。
6つのデータ型
| 型 | 例 | ルール |
|---|---|---|
| 文字列 | "東京"、"caf\u00e9" | ダブルクォートのみ、\uエスケープ可 |
| 数値 | 42、-3.5、1.2e6 | 先頭の0、先頭の+、16進数、NaN、Infinityは不可 |
| 真偽値 | true、false | 小文字のみ |
| null | null | 「値がない」ことを表す、小文字のみ |
| オブジェクト | {"id": 7} | キーは文字列で、重複しないようにする |
| 配列 | [1, "two", false] | 順序があり、型を混ぜられる |
ないものにも注目してください。日付の型はありません。日付はふつう"2026-11-05T14:30:00Z"のようなISO 8601形式の文字列か、Unixタイムスタンプで保存します。どちらもUnix時間のガイドで説明しています。整数専用の型もなく、JavaScriptを含む多くのパーサーはすべての数値を64ビットの浮動小数点数として扱います。そのため、9,007,199,254,740,991を超える整数は、知らないうちに値が変わることがあります。JavaScriptは{"id": 9007199254740993}を9007199254740992として読み込みます。大きなIDが文字列でやり取りされることが多いのはこのためです。
JavaScriptのJSON.stringifyは、JSONで表せない値も黙って変換します。値がundefinedのプロパティは消え、NaNとInfinityはnullになります。
よくあるエラーと直し方
JSONのパーサーは厳格で、ミスが1つでもあると文書全体を受け付けません。エラーメッセージは位置を教えてくれますが、本当の原因より少し後ろを指していることがよくあります。たとえば末尾の余計なカンマは、その次にある閉じかっこの位置でエラーになります。よく出会うエラーは次のとおりです。
| 問題 | 誤り | 修正後 |
|---|---|---|
| 末尾のカンマ | {"a": 1, "b": 2,} | {"a": 1, "b": 2} |
| シングルクォート | {'name': '花子'} | {"name": "花子"} |
| 引用符のないキー | {name: "花子"} | {"name": "花子"} |
| コメント | {"port": 8080 // 開発用} | {"port": 8080} |
| カンマの抜け | [1, 2 3] | [1, 2, 3] |
| Python風の値 | {"ok": True, "x": None} | {"ok": true, "x": null} |
| 先頭の0 | {"code": 007} | {"code": "007"} |
| エスケープしていないバックスラッシュ | {"path": "C:\Users\hanako"} | {"path": "C:\\Users\\hanako"} |
| 文字列の中での改行 | 引用符の中でEnterを押した | "1行目\n2行目" |
| JavaScript専用の値 | {"x": undefined} | {"x": null} |
原因がはっきりしているエラーもあります。シングルクォートやTrue、Noneが見えたら、たいていはPythonの辞書をjson.dumpsで変換せずにそのまま出力したものです。見た目はJSONに似ていますが、JSONではありません。コメントや末尾のカンマは、JSONCやJSON5で書かれた設定ファイルから紛れ込むことがよくあります。VS Codeのsettings.jsonやTypeScriptのtsconfig.jsonのように、一部のツールが受け付けるゆるい方言ですが、標準のパーサーはどちらも拒否します。純粋なJSONの中にメモを残したいなら、"_comment"のような普通のフィールドを追加しましょう。
ミスを一番早く見つけるには、文書をJSON整形ツールに貼り付けることです。入力しながらチェックして最初のエラーの行と列を表示し、フォーマットを押すとその位置に移動します。
整形と圧縮
要素の間のスペースは無視されるので、同じデータを2つのスタイルで書けます。整形(pretty-print)したJSONは、値ごとに改行し、入れ子の値をインデントするので、構造がひと目でわかります。圧縮(minify)したJSONは、不要なスペースと改行をすべて取り除きます。{"id": 1042, "name": "山田花子", "roles": ["editor", "admin"]}というデータは、圧縮すると60バイト、スペース2つでインデントすると86バイトですが、中身のデータはまったく同じです。
| 整形 | 圧縮 | |
|---|---|---|
| 向いている用途 | 読む、デバッグ、設定ファイル、コードレビュー | APIのレスポンス、保存、ほかのテキストへの埋め込み |
| サイズ | 大きい。入れ子が深いほどインデントが増える | データに必要な分だけ |
| バージョン管理 | 変更が行単位で見える | 1行なので、少し変えても全体が変わる |
ネットワーク上では、差は見た目ほど大きくありません。サーバーはレスポンスをgzipやBrotliで圧縮することが多く、繰り返されるスペースはとてもよく圧縮されるからです。保存や送信には圧縮したJSONを使い、人が読むときに整形する、という使い分けが実用的です。
JSONとCSVの違い
CSV(カンマ区切りの値)は、特に表計算ソフトとデータをやり取りするときによく使われる、もう1つの定番形式です。同じ2件のデータをそれぞれの形式で書くと、JSONでは[{"name": "美咲", "city": "大阪", "score": 92}, {"name": "Leo", "city": "Lyon", "score": 87}]となり、CSVでは見出し行name,city,scoreのあとに、1件につき1行ずつ美咲,大阪,92とLeo,Lyon,87が続きます。
| JSON | CSV | |
|---|---|---|
| 構造 | 入れ子のオブジェクトと配列 | 行と列だけの平らな表 |
| 型 | 文字列、数値、真偽値、null | すべてテキストで、読む側が推測 |
| 項目名 | オブジェクトごとに繰り返す | 見出し行に1回だけ |
| 表形式データのサイズ | 大きい | 小さい |
| 開くソフト | コードエディター、ブラウザ、API | Excel、Googleスプレッドシート、データベース |
目安は簡単です。データが表計算ソフトに自然に収まり、相手がExcelで開くならCSVを使いましょう。住所を複数持つ顧客のように入れ子の部分がある、型が大事、あるいはプログラム同士でやり取りするなら、JSONを使いましょう。CSVの弱点にも気をつけてください。カンマを含む値は引用符で囲む必要があり、表計算ソフトは090で始まる携帯電話番号や060で始まる郵便番号から、先頭の0を消してしまうことがあります。CSV ⇄ JSON変換ツールは、どちらの方向でも引用符を正しく扱い、入れ子の値は1つのセルにJSONテキストとして書き出します。
JSONが使われている場所
- Web API。ほとんどのREST APIは、
Content-Type: application/jsonヘッダーを付けてJSONをやり取りします。ブラウザの開発者ツールのネットワークタブで、こうしたレスポンスを見られます。 - 設定ファイル。JavaScriptプロジェクトの
package.json、PHPのcomposer.json、多くのアプリの設定ファイルがJSONです。 - ログイン用のトークン。JSON Web Token(JWT)は、小さなJSONオブジェクトをBase64urlでエンコードして運びます。トークンがほぼ必ず
eyJで始まるのはそのためで、{"のあとに英字が続く部分をエンコードするとこうなります。JWTデコーダーを使えば、トークンを読めるJSONに戻せます。 - ログとエクスポート。JSON Lines形式のファイル(
.jsonl)は1行に1つのJSONオブジェクトを入れるので、巨大なファイルも1行ずつ処理できます。 - データベースとブラウザ。PostgreSQLには
json型とjsonb型の列があり、Webアプリは設定をJSON文字列にしてローカルストレージに保存することがよくあります。
コードでJSONを読み書きする
| 言語 | テキスト → データ | データ → テキスト |
|---|---|---|
| JavaScript | JSON.parse(text) | JSON.stringify(data, null, 2) |
| Python | json.loads(text) | json.dumps(data, indent=2, ensure_ascii=False) |
| PHP | json_decode($text, true) | json_encode($data, JSON_PRETTY_PRINT) |
Pythonでensure_ascii=Falseを指定すると、「東京」のような日本語が\u6771\u4eacに変換されず、そのまま読める形で出力されます。また、Pythonのjsonモジュールは初期設定でNaNとInfinityを読み書きしますが、ほかのパーサーはこれを受け付けません。出力をほかのシステムに渡すときは、json.dumpsにallow_nan=Falseを指定しましょう。
関連ツール
- JSON整形 – JSONをチェックし、整形または圧縮して、エラーのある行を見つけます。
- CSV ⇄ JSON変換 – 表計算のデータをJSONに、JSONをCSVに変換します。
- JWTデコーダー – JSON Web Tokenの中のJSONを読みます。