■ はじめに
Python での JSON の読み込み・書き込みを行う
目次
【0】使用上の注意 1)値をダブルクォーテーションマーク囲む必要がある 2)末尾にカンマを入れるのはNG 3)ndjson については、別モジュールが必要 【1】JSON <=> 文字列 【2】JSONの読み込み 【3】JSONの書き込み 補足1:indent(インデント) 補足2:default 【4】JSONデータを追加
【0】使用上の注意
1)値をダブルクォーテーションマーク囲む必要がある 2)末尾にカンマを入れるのはNG
1)値をダブルクォーテーションマーク囲む必要がある
* 文字列⇒JSONへの変換において、 値をダブルクォーテーションマーク囲む必要がある
サンプル
import json # OK : 値をダブルクォーテーションマーク囲んでいる json_text = '{ "aaa1":"hello", "aaa2":"world" }' json_values = json.loads(json_text) for v, k in json_values.items(): print("{} : {}".format(v, k)) # ★NG : 値をダブルクォーテーションマーク囲んでいない json_text = "{ 'aaa1':'hello', 'aaa2':'world' }" json_values = json.loads(json_text) # json.decoder.JSONDecodeError: # Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
2)末尾にカンマを入れるのはNG
import json with open('hello.json', 'r') as file: json_dict = json.load(file) # ★ここで例外★ print(json_dict)
hello.json
{ "Name": "Mike", "Age": 24, <= ★ここにカンマがある、ダメ、絶対★ }
例外内容
raceback (most recent call last): File "c:/xxxx/demo.py", line 4, in <module> json_dict = json.load(file) ... 略 ... json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 4 column 1 (char 33)
3)ndjson については、別モジュールが必要
* ndjson については、標準 の jsonモジュールでは扱えない => 別モジュールが必要 => 以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2022/08/30/224248
【1】JSON <=> 文字列
JSON => 文字列
# json.dumps() を使用する import json json_text = json.dumps(json_dist)
https://docs.python.org/ja/3/library/json.html#json.dumps
文字列 => JSON
# json.loads() を使用する import json json_values = json.loads(json_text)
https://docs.python.org/ja/3/library/json.html#json.load
サンプル
import json if __name__ == '__main__': json_dist = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} print(type(json_dist)) print(json_dist) print('************') # JSON to string json_text = json.dumps(json_dist) print(type(json_text)) print(json_text) print('************') # string to JSON json_values = json.loads(json_text) print(type(json_values)) print(json_values)
出力結果
<class 'dict'> {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'} ************ <class 'str'> {"key1": "value1", "key2": "value2", "key3": "value3"} ************ <class 'dict'> {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
【2】JSONの読み込み
JSONの読み込み
json_file = open('members.json', 'r') json_dict = json.load(json_file)
https://docs.python.org/ja/3/library/json.html#json.load
サンプル
demo.py
import json def main(): json_file = open('members.json', 'r') json_dict = json.load(json_file) for key, values in json_dict.items(): print(key) print(values['name']) print(values['birth_day']) print('*******************') if __name__ == '__main__': main()
members.json
{ "Member01":{ "name":"Mike", "birth_day": "2019-10-12" }, "Member02":{ "name":"Tom", "birth_day": "2002-12-31" } }
出力結果
Member01 Mike 2019-10-12 ******************* Member02 Tom 2002-12-31 *******************
【3】JSONの書き込み
JSONの書き込み
json_file = open('output.json', 'w') json.dump(input_dict, json_file)
https://docs.python.org/ja/3/library/json.html#json.dump
サンプル
import json input_dict = [ {"name": "Smith", "birth_day": "2002-12-21", "gender": "man"}, {"name": "Lisa", "birth_day": "2003-08-11", "gender": "woman"}, ] with open('output.json', 'w') as json_file: json.dump(input_dict, json_file) print('Done')
出力結果 : output.json
[{"name": "Smith", "birth_day": "2002-12-21", "gender": "man"}, {"name": "Lisa", "birth_day": "2003-08-11", "gender": "woman"}]
補足1:indent(インデント)
* デフォルトだと一行で出力されるので、 見栄えよく出力したい場合は「indent=2」などと使用するといい => 以下の関連記事を参照のこと
Python で PostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029
補足2:default
* datetime/date などをJSON化する場合、 エラー「TypeError: Object of type 'datetime' is not JSON serializable」が発生する その対策として、default を使用した => 以下の関連記事および参考サイトを参照のこと
Python で PostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029
参考サイト
https://www.yoheim.net/blog.php?q=20170703
【4】JSONデータを追加
* append() を使う
サンプル
tags = [ { "Key": "Id", "Value": 10 }, { "Key": "Name", "Value": "Mike" } ] print(tags) print("************") additional_info = { "Key": "BirthDate", "Value": "1988-09-12" } tags.append(additional_info) print(tags) print("************")
出力結果
[{'Key': 'Id', 'Value': 10}, {'Key': 'Name', 'Value': 'Mike'}] ************ [{'Key': 'Id', 'Value': 10}, {'Key': 'Name', 'Value': 'Mike'}, {'Key': 'BirthDate', 'Value': '1988-09-12'}] ************
参考文献
https://qiita.com/Morio/items/7538a939cc441367070d
関連記事
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / astモジュール ~
https://dk521123.hatenablog.com/entry/2021/10/01/000000
Python ~ 基本編 / YAML ~
https://dk521123.hatenablog.com/entry/2019/10/16/225401
Python ~ JSONあれこれ ~
https://dk521123.hatenablog.com/entry/2022/02/14/000000
Python で PostgreSQL を使う ~ psycopg2編 ~
https://dk521123.hatenablog.com/entry/2020/05/06/141029
Python ~ ndjson を扱う ~
https://dk521123.hatenablog.com/entry/2022/08/30/224248