dict 値がすべてシリアライズ可能である場合
DictProxy
コンストラクターを介して渡すだけでdict
、データを JSON にシリアル化できるようです。以下の例は Python 3.6 のものです。
>>> import multiprocessing, json
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = "bar"
>>> d
<DictProxy object, typeid 'dict' at 0x2a4d630>
>>> dict(d)
{'foo': 'bar'}
>>> json.dumps(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
TypeError: Object of type 'DictProxy' is not JSON serializable
>>> json.dumps(dict(d))
'{"foo": "bar"}'
ご覧のとおり、 whiled
は であり、データのシリアル化を許可する代わりにDictProxy
使用しています。を使用している場合も同様です。json.dumps(dict(d))
json.dumps(d)
json.dump
一部の dict 値が DictProxy でもある場合
DictProxy
残念ながら、 の値もである場合、上記の方法は機能しませんDictProxy
。この例では、このような値が作成されます。
>>> import multiprocessing
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = m.dict()
json.JSONEncoder
解決策は、次のようにクラスを拡張してDictProxy
オブジェクトを処理することです。
>>> import multiprocessing, json
>>> class JSONEncoderWithDictProxy(json.JSONEncoder):
... def default(self, o):
... if isinstance(o, multiprocessing.managers.DictProxy):
... return dict(o)
... return json.JSONEncoder.default(self, o)
...
>>> m = multiprocessing.Manager()
>>> d = m.dict()
>>> d["foo"] = m.dict()
>>> d["foo"]["bar"] = "baz"
>>> json.dumps(d, cls=JSONEncoderWithDictProxy)
'{"foo": {"bar": "baz"}}'
>>> # This also works:
>>> JSONEncoderWithDictProxy().encode(d)
'{"foo": {"bar": "baz"}}'
JSON エンコーダーが に遭遇するDictProxy
と、それを に変換してからdict
エンコードします。詳細については、Python ドキュメントを参照してください。