【Python】JSONファイル読み込み時のデコードエラー

  • URLをコピーしました!

こんにちは、むらさめです。
今回はJSONファイルを読み込む処理を実装していた時に発生したエラーについて、解決策を調べたので書いておきたいと思います。

目次

用意したJSONファイル

まず今回、用意したJSONファイルはこちらです。以前書いた天気予報APIからデータを取得するプログラムで実際に生成したJSONファイルを使用します。

この記事に記載したコードを実装するとJOSNファイルが生成されます。

JSONを読み込むサンプルプログラム

JSONファイルを読み込んで表示するだけのプログラムです。

import json
json_open = open('result.json', 'r', encoding="utf-8")
jload = json.load(json_open)
for a in jload.values():
    print(a)
これを実行してみたところ以下のようなエラーが発生しました。

発生したエラー 1つ目 openメソッド

openメソッド実行時に次のようなエラーが発生しました。

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

ファイルの先頭にBOMエンコードがUTF-8であることを示すための識別子)がついているファイルを読み込もうとした場合に発生するようです。BOM有りのファイルを読み込む場合には、openメソッドの引数を以下のように修正したら解決できました。

json_open = open('result.json', 'r', encoding="utf_8_sig")

発生したエラー 2つ目 loadメソッド

loadメソッド実行時に次のようなエラーが発生しました。

json.decoder.JSONDecodeError: Invalid control character at: line 11 column 119 (char 523)

予報の文字列の改行コード、’\n’が入っているのが原因のようです。loadメソッドの引数’strict’をfalseに設定してやることで、制御文字列が使用できるようになり回避できるようです。

jload = json.load(json_open, strict=False)

コードを修正した結果

上記の修正をしたプログラムを再度実行してみます。

{'publicTime': '2021-12-11T16:33:00+09:00', 'publicTimeFormatted': '2021/12/11 16:33:00', 'headlineText': '', 'bodyText': '\u3000本州付近は、大陸の 
高気圧に覆われています。\n\n\u3000東海地方は、晴れまたは曇りとなっています。\n\n\u300011日の東海地方は、高気圧に覆われて晴れますが、気圧の谷や湿っ
た空気の影響で雲の広がる所\nがあるでしょう。\n\n\u300012日の東海地方は、高気圧に覆われて晴れる所もありますが、前線や湿った空気の影響で雲が広がりや
すく、夕方から雨や雪の降る所がある見込みです。', 'text': '\n\n\u3000本州付近は、大陸の高気圧に覆われています。\n\n\u3000東海地方は、晴れまたは曇りと
なっています。\n\n\u300011日の東海地方は、高気圧に覆われて晴れますが、気圧の谷や湿った空気の影響で雲の広がる所\nがあるでしょう。\n\n\u300012日の
東海地方は、高気圧に覆われて晴れる所もありますが、前線や湿った空気の影響で雲が広がりやすく、夕方から雨や雪の降る所がある見込みです。'}
[{'date': '2021-12-11', 'dateLabel': '今日', 'telop': '晴のち曇', 'detail': {'weather': '晴れ\u3000夜遅く\u3000くもり', 'wind': '北西の風\u3000後\u3000西の風', 'wave': '0.5メートル'}, 'temperature': {'min': {'celsius': None, 'fahrenheit': None}, 'max': {'celsius': None, 'fahrenheit': None}}, 
'chanceOfRain': {'T00_06': '--%', 'T06_12': '--%', 'T12_18': '--%', 'T18_24': '0%'}, 'image': {'title': '晴のち曇', 'url': 'https://www.jma.go.jp/bosai/forecast/img/110.svg', 'width': 80, 'height': 60}}, {'date': '2021-12-12', 'dateLabel': '明日', 'telop': '曇時々晴', 'detail': {'weather': 'くも
り\u3000昼前\u3000まで\u3000時々\u3000晴れ\u3000所により\u3000夜\u3000雨', 'wind': '北の風\u3000後\u3000北西の風\u3000海上\u3000では\u3000後\u3000北
西の風\u3000やや強く', 'wave': '0.5メートル'}, 'temperature': {'min': {'celsius': '6', 'fahrenheit': '42.8'}, 'max': {'celsius': '16', 'fahrenheit': '60.8'}}, 'chanceOfRain': {'T00_06': '0%', 'T06_12': '0%', 'T12_18': '10%', 'T18_24': '20%'}, 'image': {'title': '曇時々晴', 'url': 'https://www.jma.go.jp/bosai/forecast/img/201.svg', 'width': 80, 'height': 60}}, {'date': '2021-12-13', 'dateLabel': '明後日', 'telop': '晴時々曇', 'detail': {'weather': '晴れ\u3000時々\u3000くもり', 'wind': '北西の風', 'wave': '1メートル'}, 'temperature': {'min': {'celsius': '3', 'fahrenheit': '37.4'}, 'max': {'celsius': '11', 'fahrenheit': '51.8'}}, 'chanceOfRain': {'T00_06': '10%', 'T06_12': '10%', 'T12_18': '10%', 'T18_24': '10%'}, 'image': {'title': '晴時々曇', 'url': 'https://www.jma.go.jp/bosai/forecast/img/101.svg', 'width': 80, 'height': 60}}]
{'area': '中部', 'prefecture': '愛知県', 'district': '西部', 'city': '名古屋'}
{'title': '(C) 天気予報 API(livedoor 天気互換)', 'link': 'https://weather.tsukumijima.net/', 'image': {'title': '天気予報 API(livedoor 天気互換)
', 'link': 'https://weather.tsukumijima.net/', 'url': 'https://weather.tsukumijima.net/logo.png', 'width': 120, 'height': 120}, 'provider': [{'link': 'https://www.jma.go.jp/jma/', 'name': '気象庁 Japan Meteorological Agency', 'note': '気象庁 HP にて配信されている天気予報を JSON データへ編集して 
います。'}]}
正常にJSONファイルを読み込むことができるようになりました。

参考

よかったらシェアしてね!
  • URLをコピーしました!
目次