Python CPython 3.14.3 上でパーサーを実行して確認しました。
Expecting ',' delimiter: line L column C (char N)
パーサーは、現在のコンテナがカンマで続くことを期待していました。ややこしいのは、位置が一見まったく問題なさそうな場所を指すことが多い点です。本当の間違いは少し手前にあります。たいていは、意図より早く文字列を終わらせてしまった引用符です。
JSONを貼り付けて、壊れている箇所を正確に確認する
入力
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
実際の原因
どれが答えになることが多いか、その順に並べています。
-
01 文字列の中のエスケープされていないダブルクォート
内側の引用符が文字列を早く閉じてしまい、その後ろのテキストが、カンマを期待していた場所で新しいトークンとして読まれます。このエラーに関するStack Overflowの最上位の質問は、そのものずばり「Valid JSON giving JSONDecodeError」というタイトルで、体験のすべてが1行に凝縮されています。
壊れる例
{"quote": "he said "yes" loudly"}動く例
{"quote": "he said \"yes\" loudly"} -
02 本当にカンマが抜けている
オブジェクトの2つのメンバーの間、あるいは配列の2つの要素の間です。
-
03 閉じ引用符の直前にある単独のバックスラッシュ
バックスラッシュで終わるWindowsのパスは引用符をエスケープしてしまい、文字列が続いてしまうため、次のカンマはパーサーの期待する場所に現れません。
-
04 ファイルが途中で切れている
位置が入力の末尾なら、書き間違いではなくドキュメントが切れています。
ほかのランタイムでの同じ間違い
根本にある問題は同一で、違うのは文言だけです。同僚がこれらのどれかを報告してきたなら、見ているものはあなたと同じです。
| JavaScript (V8) | Expected ',' or '}' after property value in JSON at position N |
|---|
よくある質問
- JSONは正しく見えるのに、なぜ失敗するのですか?
- 報告された位置そのものではなく、その直前の文字を見てください。早く終わってしまった文字列は、引用符の数を数えるまで目に見えません。文字列に色を付けるバリデーターに貼り付ければ、1秒で分かります。
- これを起こさないようにするには?
- 文字列連結でJSONを組み立てないことです。dictを作ってjson.dumpsを呼べば、仕組みとしてすべての値が正しくエスケープされます。