JSONは外部のAPIや他システムと連携する際のデータフォーマットとしてよく用いられるフォーマットです。
プログラム内では受け取ったJSONデータをシステム内に取り込んだり、その逆を行ったりすることがあるため、JSONデータの操作が必要となります。
本記事では、PyhtonにおけるJSONデータの操作についてまとめます。
プログラミング初心者の方の学習や、忘れてしまった方の復習として、参考にしていただければ幸いです。
記載しているプログラムは、Python3.6.8を使って動作確認をしています。
PythonのJSON操作
PythonのJSON操作として以下の内容を採り上げます。
- JSONを扱うモジュール
- JSONファイルの読み込み
- 文字列からJSONオブジェクトへの変換
- JSONデータの参照
- JSONデータの追加
- JSONデータの削除
- JSONオブジェクトから文字列への変換
JSONを扱うモジュール
PythonでJSONデータを扱うには、標準ライブラリの json モジュールを使います。
以下のように、importが必要となります。
import json
JSONファイルの読み込み
本記事では、以下のJSONデータを扱います。
{ "string": "文字列", "int": 2020, "bool": true, "null": null, "array": [ {"no": 1, "name": "JavaScript"}, {"no": 2, "name": "Python"} ], "object": { "no": 3, "name": "Java" } }
この内容を data.json というファイルで保存し、プログラムから読み込みます。
ファイルから読み込む際に、json.load を使うことでJSONオブジェクトに変換します。
Pythonではobjectは辞書(dict)、配列はリストとして扱います。
with open('./data.json', 'r') as f: j = json.load(f) print(j) # -> 上記のJSONファイルの内容が1行で表示される
文字列からJSONオブジェクトへの変換
文字列からJSONオブジェクトへ変換するには、json.loads を使います。
例えばファイルから文字列として読み込んで、JSONオブジェクトに変換するには以下のように行います。
with open('./data.json', 'r') as f: s = f.read() j = json.loads(s) print(j) # -> 上記のJSONファイルの内容が1行で表示される
JSONデータの参照
JSONオブジェクトのデータを参照するには、データの型によって参照方法が異なります。
文字列や整数の参照
文字列や整数の参照は、直接キー名を参照することで値を参照することができます。
print(j['string']) # -> 文字列 print(j['int']) # -> 2020 print(j['bool']) # -> True print(j['null']) # -> None
配列の参照
配列の参照は、キー名にインデックスを指定して値を参照することができます。
print(j['array'][0]['no']) # -> 1 print(j['array'][0]['name']) # -> JavaScript print(j['array'][1]['no']) # -> 2 print(j['array'][1]['name']) # -> Python
配列なので、ループによる参照も可能です。
for item in j['array']: print(item['no']) # -> 1 -> 2 print(item['name']) # -> JavaScript -> Python
オブジェクトの参照
オブジェクトの参照は、ネストするオブジェクトのキー名を参照して値を取得することができます。
print(j['object']['no']) # -> 3 print(j['object']['name']) # -> Java
JSONデータの追加
JSONオブジェクトにデータを追加するには、参照と同じくデータの型によって追加方法が異なります。
文字列や整数の追加
文字列や整数値の追加は、jsonオブジェクトに直接キーと値を指定します。
j['string2'] = "文字列2" j['int2'] = 2021 j['bool2'] = False j['null2'] = None
配列の追加
配列に追加するには、appendを使って追加するJSONを指定します。
j['array'].append({'no': 4, 'name': 'Ruby'})
オブジェクトの追加
オブジェクトを追加するには、オブジェクトをネストさせてキーと値を指定します。
j['object']['object2'] = {'no': 5, 'name': 'Go'}
上記で追加したJSONオブジェクト全体を表示させると以下のようになります。
{'array': [{'name': 'JavaScript', 'no': 1}, {'name': 'Python', 'no': 2}, {'name': 'Ruby', 'no': 4}], 'bool': True, 'bool2': False, 'int': 2020, 'int2': 2021, 'null': None, 'null2': None, 'object': {'name': 'Java', 'no': 3, 'object2': {'name': 'Go', 'no': 5}}, 'string': '文字列', 'string2': '文字列2'}
JSONデータの削除
JSONオブジェクトからデータを削除するには、del を使います。
del j['string2'] del j['int2'] del j['bool2'] del j['null2'] del j['array'][2] del j['object']['object2']
上記で削除した結果のJSONオブジェクト全体を表示させると以下のようになります。
(追加した分が削除されて、元の状態に戻っています)
{'array': [{'name': 'JavaScript', 'no': 1}, {'name': 'Python', 'no': 2}], 'bool': True, 'int': 2020, 'null': None, 'object': {'name': 'Java', 'no': 3}, 'string': '文字列'}
JSONオブジェクトから文字列への変換
JSONオブジェクトから文字列へ変換するには、json.dumps を使います。
s = json.dumps(j, ensure_ascii=False) print(s) # -> {"string": "文字列", "int": 2020,・・・(省略)
デフォルトでは日本語などがUnicodeエスケープされて出力されます。
日本語のままの状態とするには、ensure_asciiにFalseを指定します。
文字列に変換できれば、APIに渡すデータとして指定するなど様々な用途として使用できます。
ファイルに書き込むには、json.dump を使うとファイルハンドルオブジェクトをそのまま渡せるので楽に行うことができます。
JSONデータを自由に扱えるようになろう
最近では、JSON形式のデータをプログラム内だけではなく、ログやインフラ等の設定情報、保存用データなど様々な部分で使われることが増えてきました。
プログラマブルなデータフォーマットとして保存することで、プログラムで自由に解析をしやすくする意図があります。
ちょっとしたJSON解析プログラムを作ることで、今までExcelで集計していた業務を効率化することが出来たり、プログラムによってチェックすることで作業ミスを防止することも出来ます。
こうした日頃の作業をプログラマブルに出来ないか考えてみるのも良いと思います。
今回はPythonのJSON操作についてまとめました。
以上、参考になれば幸いです。
コメント