ユーニックス総合研究所

  • home
  • archives
  • python-json-dump

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()にはたくさんの引数がありますが、肝心なのはobjfpの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が正の整数または文字列であれば、データがそのインデントのレベルに合わせて整形されます。
indent0か負数、または空文字列であれば改行だけ挿入されます。
デフォルトのNoneでは最小の表現をした整形が行われます。
インデントはスペースで行われます。
タブでインデントしたい場合はindent\tなどのタブを指定します。

separators

この引数はデフォルトでNoneです。
セパレーターの文字を指定します。
指定する場合はタプルで指定します。↓のようなフォーマットです。

 (item_separator, key_separator)  

デフォルトではindentNoneのとき(', ', ': ')が指定されます。
そうでなければ(',', ': ')が指定されます。
最小の表現にしたければ空白を削り(',', ': ')などにします。

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ですね。