Pythonの標準ライブラリにはJSONを扱うjson
があるため、気軽にJSONの読み書きができます。
json
ライブラリには読み書きに使用する関数として、load
, loads
, dump
, dumps
があります。それぞれの役割を表に表すと次のようになります。
役割\ソース&出力先 | ファイル | 文字列 |
読み込み | load | loads |
書き込み | dump | dumps |
文字列をソースや出力先とする場合はloads
, dumps
ですが、これらのsはstring(文字列)だと覚えると覚えやすいかもしれません。
JSONを読み込む
JSONを読み込むといっても、Pythonのオブジェクトや型とJSONは似て非なるものなので、何がどのように変換されるかは↓を見て確認すると良いかもしれません。

json.load
下記のJSONを読み込む想定でコードを書いていきます。
{"name": "John Smith", "age": 33}
JSONファイルを読み込むには下記コードのように、ファイルを開き、そのファイルに対して、json.load()
を行います。
import json
file = open('./test.json', 'r')
data = json.load(file)
file.close()
print(data)
# {'name': 'John Smith', 'age': 33}
print(data['name'])
# John Smith
json.loads
json.loads
ではJSONを表す文字列を、対応するPythonのオブジェクトや型に変換することができます。APIなどでJSONを受け取る場合はjson.load
よりもこちらを使うことになりそうです。
import json
json_str = '{"name": "John Smith", "age": 33}'
data = json.loads(json_str)
print(data)
# {'name': 'John Smith', 'age': 33}
print(data['name'])
# John Smith
JSONを書き込む
json.dump
JSONを書き込むには、JSONファイルを書き込みで開いたのちに、json.dump(<書き込むデータ>, <書き込み先のファイル>)
を行います。
書き込むデータはPythonのオブジェクトや型でOKです。自動でJSONに変換してくれます。
import json
data = {'name': 'John Smith', 'age': 33}
out_file = open('./out.json', 'w')
json.dump(data, out_file)
out_file.close()
{"name": "John Smith", "age": 33}
json.dumps
ファイルに書き込むのではなく、文字列としてJSONを取得したい場合は、json.dumps
を利用します。
import json
data = {'name': 'John Smith', 'age': 33}
json_str = json.dumps(data)
print(json_str)
# {"name": "John Smith", "age": 33}
オプション
ensure_ascii:日本語を扱う時はFalseにしよう
デフォルトではensure_ascii=True
となっており、ASCII文字以外はエスケープされてしまいます。
下記のコードを実行すると、
import json
data = {'name': '山田太郎', 'age': 33}
out_file = open('./out.json', 'w')
json_data = json.dump(data, out_file)
out_file.close()
このように、日本語がエスケープされてしまいます。
{"name": "\u5c71\u7530\u592a\u90ce", "age": 33}
そのため、データに日本語を使用する時は ensure_ascii=False
にしておくと良いです。
import json
data = {'name': '山田太郎', 'age': 33, 'male': True}
out_file = open('./out.json', 'w')
json_data = json.dump(data, out_file, ensure_ascii=False)
out_file.close()
{"name": "山田太郎", "age": 33}
indent:見やすくインデント
これまでJSONを扱ってきた時、下記のように1行に表示されていたと思います。量が少ないうちは良いですが、情報が多くなってくると見にくくなります。
{"name": "John Smith", "age": 33}
そこで、indent
オプションにインデント数を与えすることで、見やすく整形をしてくれます。
import json
data = {'name': 'John Smith', 'age': 33, 'male': True}
out_file = open('./out.json', 'w')
json_data = json.dump(data, out_file, indent=4)
out_file.close()
{
"name": "John Smith",
"age": 33
}
コメント