JSONのエラー、解説
ここの各ページは、ひとつの正確なエラーメッセージを取り上げ、3つの問いに答えます。パーサーは実際に何に文句を言っていたのか、現実のコードでそれを引き起こすのは何か(頻度順)、そして何を変えればよいのか。どのページにもバリデーターを埋め込んであるので、ページを離れずにペイロードを直せます。
メッセージは記憶ではなく実測です。このサイトのV8とPythonの文字列はすべて、実際にパーサーを走らせて得たものです。FirefoxとSafariの文字列は意図的に載せていません。実行して検証できなかったからで、正しさを丸ごと論拠にしているサイトがエラーメッセージについて推測を公開するのは、割に合わない取引です。
あるいは、ペイロードを貼るだけでも
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
JavaScript、Node、Chrome
Node v24.15.0(V8 13.6.233.17)で実測。V8は2022年にこれらのメッセージをほぼ全面的に書き直したので、各ページには現行の文言と、古い回答で見かける文言の両方を載せています。
-
Unexpected token '<', "<!DOCTYPE "... is not valid JSONサーバーがエラーページを返した 、ほか原因が4件。 -
Unexpected end of JSON input文字列が空 、ほか原因が4件。 -
"[object Object]" is not valid JSONその値はすでにパース済みだった 、ほか原因が2件。 -
"undefined" is not valid JSON一度も設定されていないストレージのキー 、ほか原因が2件。 -
Unexpected non-whitespace character after JSON at position N (line L column C)入力がNDJSONまたはJSON Lines 、ほか原因が3件。 -
Bad control character in string literal in JSON at position N (line L column C)複数行のテキストを文字列に直接貼り付けた 、ほか原因が3件。 -
Bad escaped character in JSON at position N (line L column C)バックスラッシュが1つだけのWindowsのファイルパス 、ほか原因が3件。 -
Expected double-quoted property name in JSON at position N (line L column C)閉じ波括弧の前の末尾カンマ 、ほか原因が2件。 -
Expected property name or '}' in JSON at position N (line L column C)str()で出力したPythonのdictに由来する、シングルクォートのキー 、ほか原因が3件。 -
Expected ',' or '}' after property value in JSON at position N (line L column C)プロパティ間のカンマの書き忘れ 、ほか原因が3件。 -
Unterminated string in JSON at position N (line L column C)値の中にあるエスケープされていないダブルクォート 、ほか原因が3件。
Python
CPython 3.14.3で実測。このうち2つはPython 3.13で新しくなったメッセージなので、バージョンが効いてきます。どれがそうかは各ページに書いてあります。
-
Expecting value: line 1 column 1 (char 0)レスポンスのボディがJSONではなくHTML 、ほか原因が3件。 -
Extra data: line L column C (char N)ファイルがJSON Lines 、ほか原因が2件。 -
Expecting ',' delimiter: line L column C (char N)文字列の中のエスケープされていないダブルクォート 、ほか原因が3件。 -
Expecting property name enclosed in double quotes: line L column C (char N)シリアライズではなく出力されたPythonのdict 、ほか原因が2件。 -
Invalid control character at: line L column C (char N)文字列の中の複数行テキスト 、ほか原因が2件。 -
Invalid \escape: line L column C (char N)Windowsのパス 、ほか原因が2件。 -
Unterminated string starting at: line L column C (char N)値の中のエスケープされていない引用符 、ほか原因が2件。
PHP
PHPは既定で黙って失敗します。それこそが本当の問題です。実際にメッセージを取り出す方法をページで扱っています。
C#と.NET
Newtonsoft.JsonとSystem.Text.Jsonは、同じ失敗を別の言葉で表します。
Java
Jackson。JVMのエコシステムのほぼすべてが下敷きにしているものです。
これらの大半の背後にある4つの間違い
文言を剥がしてしまえば、このページのメッセージはほとんどが4つのうちのどれかから来ています。
- そもそもJSONではない
- HTMLのエラーページ、空のボディ、プレーンテキストのメッセージ。パーサーは正しく、間違っているのはリクエストです。ボディを調べる前にステータスコードとContent-Typeを確かめてください。
- JSONではなくJavaScriptかPythonである
- シングルクォート、引用符のないキー、末尾カンマ、TrueとNone。ほぼ必ず、直列化ではなく印字されたdictかオブジェクトリテラルです。修復がすべて直します。
- 文字列連結で組み立てられた
- つまり値が一度もエスケープされていないということで、そのどれかに引用符か改行が入れば文書が壊れます。代わりに直列化すれば、この種のバグは起こりえなくなります。
- 1つではなく複数の文書である
- NDJSONを単一の値として読んでいます。1行ずつ読むか、レコードを配列で包んでください。