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小文字のみ
nullnull「値がない」ことを表す、小文字のみ
オブジェクト{"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が続きます。

JSONCSV
構造入れ子のオブジェクトと配列行と列だけの平らな表
型文字列、数値、真偽値、nullすべてテキストで、読む側が推測
項目名オブジェクトごとに繰り返す見出し行に1回だけ
表形式データのサイズ大きい小さい
開くソフトコードエディター、ブラウザ、APIExcel、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を読み書きする

言語テキスト → データデータ → テキスト
JavaScriptJSON.parse(text)JSON.stringify(data, null, 2)
Pythonjson.loads(text)json.dumps(data, indent=2, ensure_ascii=False)
PHPjson_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を読みます。