[Python3]「json.decoder.JSONDecodeError: Expecting value ~」ってエラーに遭遇した時の対処法
Pythonで.jsonのファイルを読み込んでデータをパースしようとしたんだけど、下のエラーが出た。
json.decoder.JSONDecodeError: Expecting value: line 1 column 19 (char 18)
JSONファイルは以下のような感じで書いてあるんだけど、どうも「True」の箇所でエラーが起きているらしい。
{"domain": "hoge.jp", "httpOnly": True, ~(後略)~
色々サイトを調べて回ってみたけど、ちらほらと対処法みたいのものが見つかるものの、どれも解決には導いてくれなかったので自力で解決する事にになった。
とりあえずエラーの原因として考えられたのは、Trueが値として認識されてないという事。
Trueがダブルクオーテーションに囲まれてないからエラーになるのではないかと。
でも違った。なぜなら数値はダブルクオーテーションに囲まれてなくても普通にパースされていたから。
結局何が原因だったかというと、「True」ではなく「true」でないとパースできないという仕様が原因だったらしい。
まじかよ・・・Pythonなのに小文字のtrueなの・・・
ていうか、APIから直接取得したJSONデータだとTrueのままでもちゃんとパースできたじゃんかよ。
なんでファイルからだとうまくいかないんだろ。
APIの時は成功してた事もあって原因特定に時間がかかってしまった。
とりあえずパースする際は、
1 2 3 4 | with open(JSON_FILE_PATH, mode = 'r', encoding = 'utf-8') as fh: json_txt = fh.read() json_txt = str(json_txt).replace("'", '"').replace('True', 'true').replace('False', 'false') json_data = json.loads(json_txt) |
とすれば大丈夫。
ちなみに「.replace("'", '"')」としているのは、JSONの値がシングルクオートで囲まれていた場合エラーが発生するから。
ダブルクオーテーションで囲んでおけば安全。
但し、値の中にシングルクオーテーションが入っている場合はreplaceすると値が変わってしまうので注意!
この記事へのコメントはこちら