JSONの構文エラーを直す:よくある7つのミスとJSONの整え方
APIのレスポンス、設定ファイル、ログなど、JSONは開発者が最もよく読むデータ形式です。それでもカンマや引用符ひとつで「Unexpected token」エラーが起こります。原因をすばやく見つける方法を紹介します。
基本のルール
JSON(JavaScript Object Notation)はRFC 8259とECMA-404で標準化されたテキスト形式です。JavaScriptから生まれましたが、今ではほぼすべての言語でサポートされています。値の型は、文字列、数値、真偽値(true/false)、null、配列、オブジェクトの6種類だけです。
オブジェクトは波かっこの中に "キー": 値 の組を、配列は角かっこの中に値を並べ、どちらもカンマで区切ります。キーは必ずダブルクォートで囲んだ文字列です。ルールが単純なぶん厳格で、JavaScriptのコードでは許される書き方がJSONではエラーになることがあります。
{
"id": 1024,
"name": "AIBIZAP",
"active": true,
"tags": ["tools", "guides"],
"owner": null
}
パースエラーを起こす7つのミス
エラーメッセージが示す位置の直前を見てください。ほとんどの場合、原因はこのどれかです。JSONフォーマッターに貼り付けるとインデントが整い、問題の行が見つけやすくなります。
- 末尾のカンマ:[1, 2, 3,] は無効です。
- シングルクォート:'name' ではなく必ず "name" を使います。
- 引用符のないキー:{name: "a"} はJavaScriptのオブジェクトであって、JSONではありません。
- コメント:標準のJSONには // や /* */ のコメントはありません。
- エスケープ漏れ:文字列の中では引用符を \"、バックスラッシュを \\、改行を \n と書きます。C:\Users のようなWindowsのパスをそのまま書くと文書が壊れます。
- 特殊な値:NaN、Infinity、undefined はJSONには存在しません。値がない場合は null を使います。
- BOMと見えない文字:ファイル先頭のUTF-8 BOMや、コピー時に紛れ込んだノーブレークスペースがあると、最初の文字でエラーになることがあります。
大きな数値と小数に注意
JSONの標準は数値の大きさを制限していませんが、JavaScriptはすべての数値を64ビット浮動小数点数で保持します。2^53(9,007,199,254,740,992)を超える整数は正確に表せないため、数値として送った長いIDは、ブラウザーで末尾の桁が変わってしまうことがあります。
こうした値は最初から "id": "1234567890123456789" のように文字列で送りましょう。金額にも似た問題があり、浮動小数点では 0.1 + 0.2 が 0.30000000000000004 になるため、金額は最小通貨単位の整数や文字列で送ることがよくあります。
JSONには日付型がない
日付は通常、ISO 8601の文字列("2026-10-28T09:00:00Z")か、Unixタイムスタンプ(1793178000)で送ります。読みやすく曖昧さがないため、末尾にZ(UTC)や +09:00 のような明示的なオフセットを付けたISO 8601がおすすめです。
"2026-10-28 09:00" のようにタイムゾーンのない値は、受け取る側がサーバー時刻なのか利用者の時刻なのかを推測するしかなく、9時間ずれるといったバグにつながります。
整形と圧縮
インデントと改行を入れるとJSONは読みやすくなり、空白をすべて取り除くと転送サイズが小さくなります。意味はまったく同じなので、デバッグ中は整形し、転送や保存のときは圧縮しましょう。
設定ファイルのように人が編集するJSONは、整形した状態でバージョン管理すると変更を確認しやすくなります。キーの順序に意味はありませんが、キーを並べ替えておくと差分がずっと読みやすくなります。
JSONをコードやテーブルに変換する
APIレスポンスのサンプルから、対応するC#、Java、Python、TypeScriptのクラスが必要になることはよくあります。数十のフィールドを手で写すと打ち間違いのもとです。JSONクラス生成ツールならサンプルから型を推定してモデルのコードを書いてくれます。
同じデータをデータベースに保存するなら、JSON DDL生成ツールで CREATE TABLE 文の下書きを作れます。推定される型はサンプルの値だけに基づいているので、確定する前にnull許容のフィールド、文字列の長さ、主キーを見直しましょう。