リテラル json 文字列を保持できる特別なオブジェクトがあるとします。これは、より大きな JSON オブジェクトのフィールドとして、リテラル値自体 (JSON を含む文字列ではありません) として使用する予定です。
これを実現できるカスタム エンコーダーを書きたいと思います。
> encoder.encode({
> 'a': LiteralJson('{}')
> })
{"a": {}}
JSONEncoder のサブクラス化とデフォルトのオーバーライドがうまくいくとは思えません{"a": "{}"}
。
LiteralJson が別のディクショナリ内のどこかにネストされている場合、エンコードのオーバーライドも機能しないようです。
興味があれば、これの背景は、JSON でエンコードされた値をキャッシュに保存していることです。そのように動作しますが、これらの値の一部はかなり長く、無駄に見えるだけです。
次のエンコーダーは、私が好きなことを実現します (ただし、不必要に遅いようです)。
class MagicEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, LiteralJson):
return json.loads(obj.content)
else:
return json.JSONEncoder.default(self, obj)