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は現代の開発において欠かせないフォーマットです。基本的な使い方を押さえておくことで、さまざまな場面で活用できるでしょう。
-
Pythonで文字列をJSONに変換する方法|json.loads()の使い方を解説
PythonでJSON文字列を辞書(dict)に変換する基本Pythonでは、標準ライブラリの json モジュールを使うことで、JSON形式の文字列を簡単に扱うことができます。文字列として渡されたJSONデータをPythonの辞書型に変換するには、json.loads() メソッドを使用します。json.loads() は、有効なJSON文字列を受け取り、それを解析して辞書オブジェクトを返します。返された辞書には、すべての要素にキーを使ってアクセスできます。json.loads()の使用例>>> import json >>> s = {success:
-
PythonでJSONを解析する方法!json.load()による読み込みとデータ抽出の基本
PythonでJSONを解析(パース)するにはどうすればよいのでしょうか。基本的な流れはシンプルです。まず json.load() メソッドを使ってJSONファイルを読み込みます。すると、結果はPythonの辞書型として返されるため、あとは通常の辞書操作で各フィールドにアクセスできるようになります。 JSONは軽量なデータ交換フォーマットで、APIレスポンスや設定ファイルなど、さまざまな場面で利用されています。 JSONファイルやJSONレスポンスから情報を取り出すには、まずデータをパースしてPythonで扱える形に変換する必要があります。 PythonでJSONファイルを読み込む この記事で