考虑我有一个特殊的对象,它可能包含一个文字 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)