JavaScriptを有効にしてください

PythonでJSONを扱う

 ·  ☕ 3 min read  ·  ✍️ Helve

はじめに

Pythonの標準ライブラリjsonを使って、JSONデータを辞書型データ (dict) として扱う方法をまとめた。
環境はPython 3.8.5である。

また、以下ではライブラリを次のようにインポートしていることを前提とする。

1
import json

なお、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)

実行結果

1
{'hoge': 'fuga'}

辞書型データを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
  }
}

参考

シェアする
ブログランキングに参加中です。クリックして頂けると励みになります。

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。Twitterで新着記事を配信中です