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