PythonでJSONファイルを読み込む・書き込む

Pythonの標準ライブラリにはJSONを扱うjsonがあるため、気軽にJSONの読み書きができます。

jsonライブラリには読み書きに使用する関数として、load, loads, dump, dumpsがあります。それぞれの役割を表に表すと次のようになります。

役割\ソース&出力先ファイル文字列
読み込みloadloads
書き込みdumpdumps

文字列をソースや出力先とする場合はloads, dumpsですが、これらのsはstring(文字列)だと覚えると覚えやすいかもしれません。

JSONを読み込む

JSONを読み込むといっても、Pythonのオブジェクトや型とJSONは似て非なるものなので、何がどのように変換されるかは↓を見て確認すると良いかもしれません。

json --- JSON エンコーダおよびデコーダ
ソースコード: Lib/json/__init__.py JSON (JavaScript Object Notation) は、 RFC 7159( RFC 4627 を obsolete) と ECMA-404 によって定義された軽量のデータ交換用のフォーマットです。 JavaScript のオブジェクトリテラル記...

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
}

コメント