Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでJSONを扱う方法|jsonモジュールによる変換とエンコード・デコードの基本

JSON(JavaScript Object Notation)は、軽量で広く普及しているデータ交換フォーマットです。Pythonでは標準ライブラリに含まれる json モジュールを使うことで、JSON文字列をPythonオブジェクトへ変換したり、その逆にPythonオブジェクトをJSON文字列へ変換したりできます。

json モジュールはPythonの標準ライブラリに同梱されているため、追加インストールは不要です。まずはインポートしましょう。

import json

PythonオブジェクトをJSON文字列へ変換する

json モジュールには、PythonオブジェクトをJSON形式へ変換(シリアライズ)するためのメソッドとして dump()dumps() が用意されています。

dump() メソッドは2つの引数を取ります。第1引数が変換対象のオブジェクト、第2引数が書き込み先のファイルオブジェクトです。このメソッドはオブジェクトをJSON形式のストリームとしてファイルオブジェクトへ書き出します。一方、dumps() メソッドはオブジェクトを1つの引数として受け取り、JSON形式の文字列として返します。

サンプルコード

import json
from io import StringIO

str_io_obj = StringIO()

# json.dump() を使って StringIO に書き込む
json.dump(["India", "Australia", "Brazil"], str_io_obj)
print('StringIO Object value: ' + str(str_io_obj.getvalue()))

my_json = {
    "name": "Kalyan",
    "age": 25,
    "city": "Delhi"
}

# indent=4 で整形されたJSON文字列を出力
print(json.dumps(my_json, indent=4))

実行結果

StringIO Object value: ["India", "Australia", "Brazil"] {
    "name": "Kalyan",
    "age": 25,
    "city": "Delhi"
}

dumps()indent 引数を指定すると、インデント付きの見やすいJSON文字列を生成できます。APIレスポンスや設定ファイルの出力などで便利な機能です。

JSON文字列をPythonオブジェクトへ変換する

逆に、JSON文字列をPythonオブジェクトへ戻す操作は「デシリアライズ」と呼ばれます。これには load()loads() の2つのメソッドがあります。

load() はファイルオブジェクトから読み込んだデータをPythonオブジェクトへ変換し、loads() は文字列型のデータをPythonオブジェクトへ変換します。

サンプルコード

import json
from io import StringIO

str_io_obj = StringIO('["xyz", "abc", "xyz", "pqr"]')

# StringIO から読み込んで変換
print('Load: ' + str(json.load(str_io_obj)))

# 文字列から直接変換
print('String to Json: ' + str(json.loads('{"xyz": 1, "abc": 2, "xyz": 3, "pqr": 4}')))

実行結果

Load: ['xyz', 'abc', 'xyz', 'pqr']
String to Json: {'xyz': 3, 'abc': 2, 'pqr': 4}

なお、上記の例ではキー "xyz" が重複しています。JSON文字列内に同じキーが存在する場合、後から読み込まれた値が前の値を上書きするため、結果では 'xyz': 3 となっています。重複キーは仕様上許容されますが、実務では避けるのが望ましいでしょう。

JSONEncoder クラスと JSONDecoder クラス

json.JSONEncoder クラスを継承して default() メソッドをオーバーライドすると、通常はJSON化できないPythonオブジェクト(複素数や日付型など)も独自のルールで変換できるようになります。

次の例では、複素数(complex型)のオブジェクトを実部と虚部のリストとしてJSON化しています。

サンプルコード

import json

class Comp_Encoder(json.JSONEncoder):
    def default(self, comp_obj):
        if isinstance(comp_obj, complex):
            return [comp_obj.real, comp_obj.imag]
        return json.JSONEncoder.default(self, comp_obj)

print(json.dumps(5 + 8j, cls=Comp_Encoder))

実行結果

[5.0, 8.0]

cls 引数に独自のエンコーダークラスを渡すことで、dumps() の動作を拡張できる点がポイントです。

一方、json.JSONDecoder クラスはその逆の処理、つまりJSON文字列のデコードを担います。decode() メソッドは文字列全体を解析してPythonオブジェクトを返し、raw_decode() メソッドは先頭から有効なJSON部分だけを解析し、結果とともに終了位置(インデックス)もタプルで返します。

サンプルコード

import json

my_str = '{"Asim": 25, "Priyesh": 23, "Asim": "28"}'

# JSONDecoder でデコード
print(json.JSONDecoder().decode(my_str))
print(json.JSONDecoder().raw_decode(my_str))

実行結果

{'Asim': '28', 'Priyesh': 23}
({'Asim': '28', 'Priyesh': 23}, 44)

まとめ

Pythonの json モジュールを使えば、以下のような相互変換が簡単に行えます。

  • dump() / dumps():Pythonオブジェクト → JSON(ファイルストリーム / 文字列)
  • load() / loads():JSON(ファイルストリーム / 文字列)→ Pythonオブジェクト
  • JSONEncoder / JSONDecoder:変換ルールのカスタマイズ

Web APIとの通信や設定ファイルの読み書きなど、JSONは現代の開発において欠かせないフォーマットです。基本的な使い方を押さえておくことで、さまざまな場面で活用できるでしょう。

  1. Pythonで文字列をJSONに変換する方法|json.loads()の使い方を解説

    PythonでJSON文字列を辞書(dict)に変換する基本Pythonでは、標準ライブラリの json モジュールを使うことで、JSON形式の文字列を簡単に扱うことができます。文字列として渡されたJSONデータをPythonの辞書型に変換するには、json.loads() メソッドを使用します。json.loads() は、有効なJSON文字列を受け取り、それを解析して辞書オブジェクトを返します。返された辞書には、すべての要素にキーを使ってアクセスできます。json.loads()の使用例>>> import json >>> s = {success:

  2. PythonでJSONを解析する方法!json.load()による読み込みとデータ抽出の基本

    PythonでJSONを解析(パース)するにはどうすればよいのでしょうか。基本的な流れはシンプルです。まず json.load() メソッドを使ってJSONファイルを読み込みます。すると、結果はPythonの辞書型として返されるため、あとは通常の辞書操作で各フィールドにアクセスできるようになります。 JSONは軽量なデータ交換フォーマットで、APIレスポンスや設定ファイルなど、さまざまな場面で利用されています。 JSONファイルやJSONレスポンスから情報を取り出すには、まずデータをパースしてPythonで扱える形に変換する必要があります。 PythonでJSONファイルを読み込む この記事で