メインコンテンツへスキップ

PythonでJSONを扱う

·1099 文字·3 分
目次

はじめに
#

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
  }
}

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

SphinxでPython docstringからドキュメントを自動生成する
·2014 文字·5 分
ドキュメント生成ツールSphinxを使って、Pythonスクリプトのクラスや関数のdocstringからHTMLドキュメントを自動生成する方法を解説する。
PythonのsubprocessでWindowsコマンドを実行
·960 文字·2 分
Pythonの標準ライブラリsubprocessを使ってWindowsのコマンドを実行する方法を解説する。
Scikit-learnのPolynomialFeaturesでべき乗を求める
·1917 文字·4 分
PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。
【Python】ネストされたリスト・辞書とdeepcopy
·1363 文字·3 分
Pythonでネストされたリストや辞書をコピーするとき、一方に加えた変更が他方に反映されないようにしたい場合は、copyモジュールのdeepcopy()関数を用いる。deepcopy()関数によって、リスト・辞書の参照先でなく、実体が全てコピーされる。
PandasのTimestampでタイムゾーンを扱う
·1568 文字·4 分
PandasのTimestampオブジェクトにタイムゾーンを設定する方法や、異なるタイムゾーンに変換する方法について述べる。
PandasのTimestampで時刻を扱う
·2140 文字·5 分
PandasのTimestampを使った時刻の生成や、時刻オブジェクトからの属性の取得、任意形式の文字列での出力について述べる。