Python CPython 3.14.3 上でパーサーを実行して確認しました。
Expecting property name enclosed in double quotes: line L column C (char N)
パーサーはオブジェクトの中にいて、ダブルクォートで囲まれたキーを期待していました。しかし別のものが来ました。シングルクォート、裸の単語、あるいは古いPythonでは末尾カンマです。JSONはキーをダブルクォートの文字列であることと定めており、識別子に見えるキーであっても例外はありません。
JSONを貼り付けて、壊れている箇所を正確に確認する
入力
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
実際の原因
どれが答えになることが多いか、その順に並べています。
-
01 シリアライズではなく出力されたPythonのdict
str(d)やprint(d)はシングルクォートを生みます。このエラーの発生源として群を抜いて多いパターンです。
壊れる例
data = str({'a': 1}) json.loads(data)動く例
data = json.dumps({'a': 1}) json.loads(data) -
02 WindowsにおけるAWS/Azure CLIのクォート処理
PowerShellやcmdはPOSIXシェルとは違うやり方で引用符を扱うため、コマンドラインに直接書いたJSON引数は、ダブルクォートが取り除かれた状態でCLIに届きます。確実な対処は、シェルと戦うのをやめてJSONをファイルに置き、file://params.jsonを渡すことです。
壊れる例
aws dynamodb query --key-condition-expression "{\"id\": ...}"動く例
aws dynamodb query --cli-input-json file://params.json -
03 Python 3.12以前における末尾カンマ
3.13より前は、末尾カンマがこのメッセージを出していました。3.13以降は専用のメッセージ「Illegal trailing comma before end of object」になります。バージョンに触れていない解説を読んでいる場合、目の前の表示と食い違う理由はこれです。
ほかのランタイムでの同じ間違い
根本にある問題は同一で、違うのは文言だけです。同僚がこれらのどれかを報告してきたなら、見ているものはあなたと同じです。
| JavaScript (V8) | Expected property name or '}' in JSON at position 1 (line 1 column 2) |
|---|
よくある質問
- Pythonのdictのreprを書き換えずにパースできますか?
- ast.literal_evalが安全に処理します。evalと違い、任意のコードを実行せずにPythonのリテラル構文だけを評価します。本物のJSONが必要なら、その結果をjson.dumpsに通してください。