はじめに #
Pythonの標準ライブラリjson
を使って、JSONデータを辞書型データ (dict) として扱う方法をまとめた。
環境はPython 3.8.5である。
また、以下ではライブラリを次のようにインポートしていることを前提とする。
import json
なお、Python 3.7以降では辞書型データの順序が保持されるが、それより前のバージョンで順序を保持する場合にはOrderedDict
を用いる。
また、標準ライブラリのpprint
は辞書型データを整形して出力するのに使用されるが、Python 3.8.5では辞書型の順序通りに出力してくれないため、この記事では使用しない。
例(この記事では使用しない)
from collections import OrderedDict
import pprint
jsonライブラリの主な関数 #
json
ライブラリでは、JSONデータを辞書型データ、または文字列データとして扱うことができる。
ここでは、以下4つの関数について述べる。
load
: JSONファイルを辞書型として読み込むloads
: JSON文字列を辞書型に変換するdump
: 辞書型データをJSONファイルとして出力するdumps
: 辞書型データをJSON形式の文字列に変換する
JSONファイルを辞書型として読み込む (load) #
まず、以下のJSONファイルを用意する。
{
"foo": 2021,
"bar": 3.14,
"baz": true,
"qux": null,
"quux": "alpha",
"corge": [1, 2, 3],
"grault": {
"foobar": 123
}
}
このJSONファイルを、json.load
関数を使って取得すると、辞書型データとして取得できる。
with open('example.json', 'r') as f:
data = json.load(f)
実行結果
>>> data
{'foo': 2021,
'bar': 3.14,
'baz': True,
'qux': None,
'quux': 'alpha',
'corge': [1, 2, 3],
'grault': {'foobar': 123}}
また、JSONデータの数値や論理値は、自動的に型の解析が行われる。
>>> print(type(data["foo"])) # 2021
<class 'int'>
>>> print(type(data["bar"])) # 3.14
<class 'float'>
>>> print(type(data["baz"])) # true
<class 'bool'>
>>> print(type(data["qux"])) # null
<class 'NoneType'>
>>> print(type(data["quux"])) # "alpha"
<class 'str'>
>>> print(type(data["corge"])) # [1, 2, 3]
<class 'list'>
>>> print(type(data["grault"])) # {"foobar": 123}
<class 'dict'>
JSON文字列を辞書型に変換する (loads) #
JSONデータが文字列として得られている場合に、これを辞書型に変換するには、json.loads
関数を用いる。
json_str = '{"hoge": "fuga"}'
data3 = json.loads(json_str)
pprint.pprint(data3)
実行結果
{'hoge': 'fuga'}
辞書型データをJSONファイルとして出力する (dump) #
辞書型データをJSONファイルとして出力するには、json.dump
関数を用いる。
with open('output.json', 'w') as f:
json.dump(data, f)
ただし、デフォルトでは改行なしで出力される。
{"foo": 2021, "bar": 3.14, "baz": true, "qux": null, "quux": "alpha", "corge": [1, 2, 3], "grault": {"foobar": 123}}
改行するにはindent
引数に整数を指定する(数値の数だけ半角スペースでインデントされる。0の場合は改行のみでインデントなし)。
例
json.dump(data, f, indent=0)
json.dump(data, f, indent=2)
辞書型データをJSON形式の文字列に変換する (dumps) #
辞書型データをJSON形式の文字列に変換するためには、json.dumps
関数を用いる。
print(json.dumps(data, indent=2))
実行結果
{
"foo": 2021,
"bar": 3.14,
"baz": true,
"qux": null,
"quux": "alpha",
"corge": [
1,
2,
3
],
"grault": {
"foobar": 123
}
}