データ

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許容のフィールド、文字列の長さ、主キーを見直しましょう。

このツールで試してみましょう

その他のガイド

すべてのガイド