PythonでJSONの読み込み: load(), loads()の使い方

249, 2021-05-13

目次

PythonでJSONの読み込み

JSON, それはデータ・フォーマットです。
PythonではこのJSON形式で記述されたテキストやファイルを読み込み、Pythonのオブジェクトに変換することができます。

この記事ではPythonでJSONデータを読み込む方法を解説します。
結論から言うと↓のような方法でJSONを読み込むことができます。

import json


with open('data.json', 'rb') as fin:
    d = json.load(fin)  # ファイルオブジェクトをオブジェクトに変換

print(d)
# {'a': 1, 'b': 2}


s = '{"a": 1, "b": 2}'

d = json.loads(s)  # 文字列のJSONをオブジェクトに変換
print(d)
# {'a': 1, 'b': 2}

この記事ではJSONの読み込みについて具体的に↓を見ていきます。

  • 直列化と脱直列化

  • jsonのインポート

  • json.load()でファイルオブジェクトを読み込む

  • json.loads()で文字列を読み込む

直列化と脱直列化

PythonのオブジェクトをJSONフォーマットの文字列に変換することを直列化(ちょくれつか)と言います。
また、その逆にJSONフォーマットの文字列をPythonのオブジェクトに変換することを脱直列化(だつちょくれつか)と言います。

直列化はエンコード、脱直列化はデコードとも言います。

jsonのインポート

今回使うPythonのライブラリはjsonという標準ライブラリです。
このjsonを使うと文字列やファイルオブジェクトをPythonのオブジェクトに変換することができます。
jsonは↓のようにインポートします。

import json

json.load()でファイルオブジェクトを読み込む

JSON形式で書かれたテキストファイルなどをopen()等で開くとそれはファイルオブジェクトになりますが、ファイルオブジェクトをPythonのオブジェクトに変換するにはjson.load()を使います。

json.load()の構造

json.load()は↓のような構造になっています。

json.load(
    fp,
    *,
    cls=None,
    object_hook=None,
    object_pairs_hook=None,
    parse_float=None,
    parse_int=None,
    parse_constant=None,
    **kw,
)

第1引数のfpにはファイルオブジェクトを渡します。
これはテキストファイルまたはバイナリファイルです。
この入力が不正なJSON形式だった場合JSONDecodeErrorが送出されます。

clsにはデコーダーを指定します。デフォルトではJSONDecoderが指定されます。

object_hookにはオプションの関数を指定します。この関数にはデコード中のオブジェクトが渡されます。
object_pairs_hookもオプションの関数です。この関数にはデコード中のオブジェクトのタプルが渡されます。

parse_floatにもオプションで関数を指定できます。この関数は1.23などの浮動小数点数をパースする時に呼ばれます。
引数には浮動小数点数の文字列が渡されます。関数の返り値にfloatを返すことでその結果がオブジェクトに保存されます。

parse_intparse_floatの整数版です。この関数は整数をパースする時に呼ばれます。

parse_constantにもオプションで関数を指定できます。これは次の文字列の時に呼ばれます。

  • -Infinity

  • Infinity

  • NaN

  • null

  • true

  • false

デコード中に不正な整数などを見つけた場合はInfinityNaNになるので、これを検出したい場合に指定します。

ファイルオブジェクトを読み込む

json.load()で例えばdata.jsonというファイルを読み込みたい場合は↓のようにします。

import json


with open('data.json', 'rb') as fin:
    d = json.load(fin)  # ファイルオブジェクトfinをデコードする

print(d)
# {'a': 1, 'b': 2}

data.jsonの中身は↓のようになっています。

{
  "a": 1,
  "b": 2
}

結果を見てもわかるようにjson.load()の返り値はPythonの辞書です。

with open('data.json', 'rb') as fin:
    d = json.load(fin)  # ファイルオブジェクトfinをデコードする
    print(type(d))
    # <class 'dict'>

よってjson.load()でオブジェクトにデコードしたあとは普通の辞書と同等に扱うことができます。

with open('data.json', 'rb') as fin:
    d = json.load(fin)  # ファイルオブジェクトfinをデコードする

for k, v in d.items():
    print(k, v)
    # a 1
    # b 2

json.loads()で文字列を読み込む

JSONのフォーマットで記述された文字列をPythonのオブジェクトに変換するにはjson.loads()を使います。

json.loads()は↓のような構造になっています。

json.loads(
    s,
    *,
    cls=None,
    object_hook=None,
    object_pairs_hook=None,
    parse_float=None,
    parse_int=None,
    parse_constant=None,
    **kw,
)

json.loads()の第1引数には文字列(str)、あるいはバイト列(bytes)、あるいはバイト配列(bytearray)を指定します。

json.loads()の引数は第1引数を除いてjson.load()と同じです。
詳細については先述のjson.load()の解説をご覧ください。

json.loads()で文字列をオブジェクトにデコードする場合は↓のようにします。

import json


s = '{"a": 1, "b": 2}'
d = json.loads(s)
print(d)
# {'a': 1, 'b': 2}

おわりに

今回はPythonでJSONを読み込む方法を解説しました。
json.load()json.loads()は名前が似ているので紛らわしいですが、間違えて使わないようにこの記事をブックマークしておいてくださいね。
ではJSONを扱う者よ、健闘を祈ります。

(^ _ ^)

JSON, それは便利オブジェクト



この記事のアンケートを送信する