Pythonのjson.dump()の使い方
- 作成日: 2021-02-11
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonのjson.dump()の使い方
プログラミング言語のPythonにはJSONを扱うモジュールjson
があります。
json
にはPythonのデータをJSON形式の文字列に変換しファイルに書き込むメソッドdump()
があります。
json.dump()
を使えばPythonのデータをJSONのデータに変換することが可能です。
この記事ではjson.dump()
の使い方について見ていきます。
具体的には↓を見ていきます。
- json.dump()の構造
- json.dump()の使い方
- json.dumps()も便利
json.dump()の構造
json.dump()
は↓のような構造を持っています。
json.dump(
obj,
fp,
*,
skipkeys=False,
ensure_ascii=True,
check_circular=True,
allow_nan=True,
cls=None,
indent=None,
separators=None,
default=None,
sort_keys=False,
**kw
)
json.dump()
にはたくさんの引数がありますが、肝心なのはobj
とfp
の2つの引数です。
obj
ファイルオブジェクトに出力するPythonのオブジェクトを渡します。
これは辞書やリストなど、JSONに変換可能なオブジェクトです。
fp
ファイルオブジェクト(ストリーム)を指定します。
「ファイルオブジェクト」という用語になじみのない人もいるかもしれません。
これは例えばC/C++系では単純にファイルなどと呼ばれます。
他の言語ではファイルに関わるクラスのオブジェクトを指していることが多いです。
またファイルオブジェクトをストリームと呼ぶこともあります。
この辺はけっこう言語によって呼び方が違っており、ファイルオブジェクトはクラスベースの言語で一般的な呼称と言えます。
このファイルオブジェクトにobj
の値がシリアライズされて出力されます。
json.dump()
はオブジェクトを文字列にシリアライズするため、ファイルオブジェクトはテキストを処理できる形式で開く必要があります。
skipkeys
この引数はデフォルトでFalse
です。
この引数がTrue
のとき、基本形(str
, int
, float
, bool
, None
)以外の辞書のキーはTypeError
を送出せずに読み飛ばします。
たとえば辞書のキーに独自のオブジェクトを指定している場合、普通にjson.dump()
を実行するとエラーになりますが、このフラグをTrue
にするとそのキーは読み飛ばされエラーになりません。
ensure_ascii
この引数はデフォルトでTrue
です。
この引数がTrue
の場合、すべての非ASCII文字はエスケープされます。
False
の場合はエスケープされずにそのまま出力されます。
check_circular
この引数はデフォルトでTrue
です。
この引数がFalse
の場合はコンテナ型の循環参照チェックが省略されます。
循環参照があった場合はOverflowError
かそれより悪い結果がもたらされます。
allow_nan
この引数はデフォルトでTrue
です。
この引数がFalse
の場合は、許容範囲外のfloat
の値をJSONの仕様に沿ってシリアライズするとValueError
になります。
この引数がTrue
の場合はJavaScriptで等価なものが使われます。
cls
この引数はデフォルトでNone
です。
カスタマイズされたJSONEncoder
のサブクラスを使う場合は、このcls
に指定します。
特に指定がなければJSONEncoder
が使われます。
シリアライズする型を追加したい場合などにJSONEncoder
のサブクラスが使われます。
サブクラスのdefault()
メソッドをオーバーライドすると可能です。
indent
この引数はデフォルトでNone
です。
indent
が正の整数または文字列であれば、データがそのインデントのレベルに合わせて整形されます。
indent
が0
か負数、または空文字列であれば改行だけ挿入されます。
デフォルトのNone
では最小の表現をした整形が行われます。
インデントはスペースで行われます。
タブでインデントしたい場合はindent
に\t
などのタブを指定します。
separators
この引数はデフォルトでNone
です。
セパレーターの文字を指定します。
指定する場合はタプルで指定します。↓のようなフォーマットです。
(item_separator, key_separator)
デフォルトではindent
がNone
のとき(', ', ': ')
が指定されます。
そうでなければ(',', ': ')
が指定されます。
最小の表現にしたければ空白を削り(',', ': ')
などにします。
default
この引数はデフォルトでNone
です。
関数を指定します。
この関数はシリアライズできないオブジェクトに対して呼び出されます。
この関数はオブジェクトをJSON
でエンコードできるデータにして返すか、TypeError
を送出する仕様にする必要があります。
sort_keys
この引数はデフォルトでFalse
です。
この引数をTrue
にすると出力がキーでソートされます。
json.dump()の使い方
json
を使うには最初にjson
モジュールをインポートしておく必要があります。
json.dump()
を使う場合はファイルオブジェクトも一緒にあつかいます。
今回はout.json
というJSON
ファイルを書き込みモードでオープンし、このファイルオブジェクトにデータを書き込むという感じでやってみたいと思います。
import json
obj = {
'Name': 'Tama',
'Age': 20,
}
with open('out.json', 'w') as fout:
json.dump(obj, fout)
↑のようにjson.dump()
の第1引数にPythonのオブジェクトを指定し、第2引数にファイルオブジェクトを指定します。
第1引数に指定したオブジェクトが文字列にシリアライズされ、その文字列がファイルオブジェクトに書き込まれるという寸法です。
↑のコードを実行し、out.json
をエディタで開くと↓のような出力が得られます。
{"Name": "Tama", "Age": 20}
↓のようにjson.dump()
のオプションを指定することで出力結果を変化させることが可能です。
import json
obj = {
'Name': 'Tama',
'Age': 20,
}
with open('out.json', 'w') as fout:
json.dump(obj, fout, indent=4, sort_keys=True, separators=(', ', ': '))
↑の出力結果↓。
{
"Age": 20,
"Name": "Tama"
}
json.dumps()も便利
json.dump()
はファイルオブジェクトに文字列を書き込むメソッドでしたが、単純に文字列として取得するjson.dumps()
というメソッドもあります。
シリアライズ化された文字列を取得したい場合はjson.dumps()
を使ってみてください。
🦝 < 名前が似ているので注意
🐭 < jsonにはそういうのが多いね
おわりに
今回はjson.dump()
の使い方を見て見ました。
json.dump()
の引数はたくさんありますが、肝心なのは最初と次の引数だけです。
あとの引数はこの記事を参照して使えば覚えなくてもOKですね。