Expected property name or '}' in JSON at position N (line L column C)
パーサーはオブジェクトを開き、ダブルクォートで囲まれたキーか閉じ波括弧のどちらかを期待していました。しかし別のものが来ました。実際のデータでは、その「別のもの」はほぼ必ずシングルクォートか裸の識別子です。つまりそのテキストは、JSONではなくPythonのdictのreprか、JavaScriptのオブジェクトリテラルだということです。
JSONを貼り付けて、壊れている箇所を正確に確認する
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
実際の原因
どれが答えになることが多いか、その順に並べています。
-
01 str()で出力したPythonのdictに由来する、シングルクォートのキー
print(my_dict)やstr(my_dict)が生むのはJSONではなくPythonの構文です。シングルクォートが使われ、true、false、nullの代わりにTrue、False、Noneが現れます。JSONを生成するにはjson.dumpsを使ってください。
壊れる例
{'name': 'Priya', 'active': True}動く例
{"name": "Priya", "active": true} -
02 JavaScriptのオブジェクトリテラルに由来する、クォートのないキー
JavaScriptは裸の識別子をキーにできます。JSONはできません。そのキーが識別子として完全に妥当であっても同じです。
壊れる例
{ name: "Priya", role: "admin" }動く例
{ "name": "Priya", "role": "admin" } -
03 設定ファイル内のコメント
JSONにコメントの構文はありません。オブジェクトの中の//や/*は、このエラーになります。
-
04 ワープロソフト由来の全角・曲線の引用符
Word、Google ドキュメント、メモ、いくつかのチャットクライアントのオートコレクトは、まっすぐな引用符を曲がった引用符に変えます。JSONのパーサーにとって曲がった引用符は文字列の区切りではなく、ただの文字です。当サイトのバリデーターは、汎用の「予期しないトークン」ではなく、その文字を名指しで報告します。
ほかのランタイムでの同じ間違い
根本にある問題は同一で、違うのは文言だけです。同僚がこれらのどれかを報告してきたなら、見ているものはあなたと同じです。
| Python | Expecting property name enclosed in double quotes: line 1 column 2 (char 1) |
|---|---|
| Java (Jackson) | Unexpected character ('s' (code 115)): was expecting double-quote to start field name |
よくある質問
- PythonのdictからJSONを正しく作るには?
- json.dumps(obj)がJSON文字列を返します。str(obj)やprint(obj)が返すのは、見た目が似ているだけのPythonの構文です。これは実際に出回っている不正なJSONの、もっともよくある発生源のひとつです。
- PythonのdictのreprをどうやってもいいのでJSONに変換できますか?
- できます。ast.literal_evalが安全にPythonのオブジェクトへ解析してくれるので、そのあとjson.dumpsを通してください。当サイトの修復ツールも同じ処理をブラウザ内で行い、シングルクォートとTrue・False・Noneのリテラルを1回のパスで変換します。