(最終更新月:2022年8月)
✔このような方へ向けて書かれた記事となります
「PythonでJSONデータを扱いたい!」
「JSONってそもそも何?」
「PythonでJSONはどんなときに使えるの?」
✔当記事を通じてお伝えすること
- JSONとは何か?
- JSONデータをPythonで読み込む方法
- JSONデータをPythonで書き出す方法
- 取り扱う際の注意点
当記事を最後までご覧いただければ、JSON形式のデータを読み書きする方法はもちろん、JSONデータ取り扱い時の注意点や実例までご理解いただけます。
JSON形式のデータとは?
JSON形式のデータは、Webアプリ開発などでよく使われます。
こちらでは、JSONについての基本をお伝えするために以下の4点を簡単に解説していきます。
- JSONとは?
- JSON形式データのメリット
- JSON形式データの実例
JSONとは?
JSONとは、データベース内のデータを読み書きする際などによく使われるデータのフォーマットのことです。
「JavaScript Object Notification」という正式名称のとおり、本来はJavaScript言語でデータを取り扱うためのフォーマットでした。
しかしその利便性から、さまざまなシーンで使われるようになったのです。
JSON形式データのメリット
JSON形式データのメリットは以下のとおり。
- 動作が軽い
- 視覚的にわかりやすく、解析しやすい
- 多くのフロントエンドで利用できる
これらのメリットにより、データベースのバックアップや移行によく使われます。
JSON形式データの実例
JSON形式のデータはPythonの辞書型のように構成されています。
必ず{“キー”: “値”}のペアであることが、もっともシンプルなJSON形式です。
具体例は以下のとおり。
{
"title": "Property1",
"prefecture": "神奈川県",
"closest_train": "相鉄本線",
"closest_station": "西谷",
"walking_from_station": 3,
"date_of_construction": "1983-03-01"
}
複数のペアを持つ際は、リスト([ ] )もしくはオブジェクト({ })で囲います。
[
{
"pk": 1,
"fields": {
"title": "Property1",
"prefecture": "神奈川県",
"closest_train": "相鉄本線",
"closest_station": "西谷",
"walking_from_station": 3,
"date_of_construction": "1983-03-01"
}
},
{
"pk": 2,
"fields": {
"title": "Property2",
"prefecture": "神奈川県",
"closest_train": "相鉄本線",
"closest_station": "上星川",
"walking_from_station": 3,
"date_of_construction": "1987-03-01"
}
},
{
"pk": 3,
"fields": {
"title": "Property3",
"prefecture": "東京都",
"closest_train": "田園都市線",
"closest_station": "二子玉川",
"walking_from_station": 3,
"date_of_construction": "2004-10-01"
}
}
]
JSON形式として正しく書かれているかは、こちら(外部リンク)のページで確認可能です。
そのほか注意点は別章でご説明しています。
JSONデータを読み込む方法
こちらではJSON形式で書かれたものをPythonで読み込む方法をお伝えします。
主に以下の2通りの方法があります。
- JSON文字列→Python辞書
- JSONファイル→Python辞書
それぞれ見ていきます。
JSON形式の文字列をPython辞書型に変換
「文字列→辞書」の変換は以下のとおりです。
json.loads(文字列)
例)こちらの文字列をPythonの辞書へ変換します。
>>> json_string = '{"title": "Property1","prefecture": "神奈川県","closest_train": "相鉄本線","closest_station": "西谷","walking_from_station": 3,"date_of_construction": "1983-03-01"}'
#念の為文字列であることを確認します。
>>> print(type(json_string))
<class 'str'>
実際に変換してみます。
>>> import json
>>> python_dict = json.loads(json_string)
#辞書へ変更できているかを確認します。
>>> print(type(python_dict))
<class 'dict'>
bytes型も辞書へ変換可能です。
bytes型とは、文字列をコンピューターに読みやすい配列に並べ替えたものです。
例えば上記の文字列をバイト列に変換し、同じ様に辞書へ変換できるか見てみましょう。
>>> bytes_json = json_string.encode("utf-8")
>>> print(bytes_json)
b'{"title": "Property1","prefecture": "\xe7\xa5\x9e\xe5\xa5\x88\xe5\xb7\x9d\xe7\x9c\x8c","closest_train": "\xe7\x9b\xb8\xe9\x89\x84\xe6\x9c\xac\xe7\xb7\x9a","closest_station": "\xe8\xa5\xbf\xe8\xb0\xb7","walking_from_station": 3,"date_of_construction": "1983-03-01"}'#bytes型に変換されました
>>> python_dict_from_bytes = json.loads(bytes_json)
>>> print(python_dict_from_bytes)
{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}
>>> print(type(python_dict_from_bytes))
<class 'dict'>
文字列と同様に変換できましたね!
JSON形式で書かれたファイルをPython辞書型に変換
「JSONファイル→Python辞書」は以下のとおりです。
with open (ファイルパス, “r”, encoding=”utf-8_sig”) as f:
json_data = json.load(f)
例として、ファイル「jason-sample.json」へ、以下のように記述します。
{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}
以下で読み込みます。
with open("json-sample.json", "r", encoding="utf-8_sig") as f:
json_data = json.load(f)
print(json_data)
[出力]
{'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}
JSONデータとして書き込み
こちらでは、Python辞書からJSONへの変更方法をお伝えします。
- Python辞書 → JSON文字列
- Python辞書 → JSONファイル
Python辞書型データをJSON文字列へ変換
Python辞書をJSON文字列へ返還するには以下のとおりです。
json.dumps(Python辞書, ensure_ascii=False)
例をご覧ください。
>>> p_dict = {'title': 'Property1', 'prefecture': '神奈川県', 'closest_train': '相鉄本線', 'closest_station': '西谷', 'walking_from_station': 3, 'date_of_construction': '1983-03-01'}
#辞書であるかを確認
>>> print(type(p_dict))
<class 'dict'>
#変換していきます
>>> json_str = json.dumps(p_dict, ensure_ascii=False)
>>> print(json_str)
'{"title": "Property1", "prefecture": "神奈川県", "closest_train": "相鉄本線", "closest_station": "西谷", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'
「ensure_ascii」を含めた引数を解説していきます。
ensure_ascii
ensure_asciiをFalseにすることで、日本語が正しく表示されます。
もしensure_asciiを設定しないと以下のとおり。
>>> json.dumps(p_dict)
'{"title": "Property1", "prefecture": "\\u795e\\u5948\\u5ddd\\u770c", "closest_train": "\\u76f8\\u9244\\u672c\\u7dda", "closest_station": "\\u897f\\u8c37", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'
英語は正しく表示されますが、日本語は読めません。
separators
separatorsは、デフォルトで(“, “, “: “)となっています。
例えば、(“/ “, “-“)と変更してみましょう。
>>> json.dumps(p_dict, ensure_ascii=False, separators=("/ ", "-"))
'{"title"-"Property1"/ "prefecture"-"神奈川県"/ "closest_train"-"相鉄本線"/ "closest_station"-"西谷"/ "walking_from_station"-3/ "date_of_construction"-"1983-03-01"}'
辞書の「:」が「-」となり、ペア同士が「/」で連結されています。
indent
indentは、改行やスペースを入れるためのものです。
ファイル出力の場合は綺麗に表示されるので重宝しますが、文字列ではあまり役に立ちません。
>>> json.dumps(p_dict, ensure_ascii=False, indent=4)
'{\n "title": "Property1",\n "prefecture": "神奈川県",\n "closest_train": "相鉄本線",\n "closest_station": "西谷",\n "walking_from_station": 3,\n "date_of_construction": "1983-03-01"\n}'
sort_keys
sort_keysはデフォルトはFalseとなっています。
Trueにすると、キーを降順で並び替えます。
>>> json.dumps(p_dict, ensure_ascii=False, sort_keys=True)
'{"closest_station": "西谷", "closest_train": "相鉄本線", "date_of_construction": "1983-03-01", "prefecture": "神奈川県", "title": "Property1", "walking_from_station": 3}'
使える場面は結構ありそうですね。
Python辞書型データをJSONファイルに保存
Python辞書をファイルに書き込むためには以下のようにします。
with open (ファイルパス, “w”, encoding=”utf-8_sig”) as f:
json_data = json.dump(Python辞書, f, **引数)
例はこちらです。
with open("new-json1.json", "w", encoding="utf-8_sig") as f:
json.dump(p_dict, f, ensure_ascii=False)
「new-json1.json」の中身はこちら。
{"title": "Property1", "prefecture": "神奈川県", "closest_train": "相鉄本線", "closest_station": "西谷", "walking_from_station": 3, "date_of_construction": "1983-03-01"}
引数「indent」を指定します。
with open("new-json2.json", "w", encoding="utf-8_sig") as f:
json.dump(p_dict, f, ensure_ascii=False, indent=4)
「new-json2.json」は以下のとおりとなりました。
{
"title": "Property1",
"prefecture": "神奈川県",
"closest_train": "相鉄本線",
"closest_station": "西谷",
"walking_from_station": 3,
"date_of_construction": "1983-03-01"
}
indentを指定するととても見やすくなります。
JSONデータを取り扱う際の注意点
PythonでJSONを扱う際に気をつけるべきポイントをまとめました。
- エンコーディング
- ダブルクォート
- データ形式
エンコーディングに気をつける
日本語を表示する際はエンコーディングに気をつける必要があります。
なぜなら何も設定しなければ以下のように表示されてしまうからです。
'{"title": "Property1", "prefecture": "\\u795e\\u5948\\u5ddd\\u770c", "closest_train": "\\u76f8\\u9244\\u672c\\u7dda", "closest_station": "\\u897f\\u8c37", "walking_from_station": 3, "date_of_construction": "1983-03-01"}'
書き込む際には以下の2点を確認しましょう。
- 引数「ensure_ascii」をFalse
- encodingを、”utf-8_sig”
ダブルクォートを使う
json.loadやjson.loadsでJSON形式のデータを読み込む際は、引用符がダブルクォートでなければいけません。
もしシングルクォートにすると以下のようなエラーが出てきてしまいます。
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
データ形式がJSONであるか確認する
JSON形式のデータは、量が多いと複雑になりやすいです。
以下のサイトでコピペするだけで調べられるので、取り込む前に確認しましょう。
DjangoフレームワークでJSON形式を扱う
Djangoフレームワークでも、データベース内のデータをJSON形式で読み書きが可能です。
書き出す際は以下のとおりです。
#全体の書き出し
python manage.py dumpdata > data.json
#特定のアプリデータだけ書き出し
python manage.py dumpdata nippo > nippo-data.json
#インデントオプションを使うと読みやすくなります
python manage.py dumpdata --indent 4 > data-indent.json
読み込む際は以下のとおり。
#ファイルの読み込み
python manage.py loaddata data.json
Pythonをベースにしたフレームワーク「Django」について詳しく知りたい方はこちらをどうぞ!
まとめ:PythonでJSONデータを使えると便利
当記事をまとめます。
- JSONとは、データの保存に向いているデータ形式である
- JSONデータを読み込むためには、「json.load」「json.loads」のどちらかを使う
- JSONデータを書き出すためには、「json.dump」「json.dumps」のどちらかを使う
Webアプリ制作などではデータベースとのやり取りが多くなります。
その際にデータバックアップなどで使えるJSON形式。
ここでマスターしておくととても便利なのでおすすめです。