我使用自定义 JSONEncoder 来更改我想要转储的 dict
中的一些值。
import json
class CustomJSONEncoder(json.JSONEncoder):
def encode(self, obj):
#obj = dict(obj)
obj['__key'] += 1
return super().encode(obj)
data = dict(__key=1)
print('dumps')
print(json.dumps(data, cls=CustomJSONEncoder))
print('dumps', json.dumps(data, cls=CustomJSONEncoder))
json.dump(data, open('test.json', 'w'), cls=CustomJSONEncoder)
print('dump', json.load(open('test.json', 'r')))
运行它会得到预期的结果:
dumps {"__key": 2}
dump {'__key': 2}
但是当我取消注释注释行(这是我最终想要做的事情所必需的,因为我不想更改原始数据)时,dumps
和 dump
表现不同:
dumps {"__key": 2}
dump {'__key': 1}
为什么会发生这种情况?有解决方法吗?
最佳答案
我认为您注释掉的行与此无关。
相反,我认为区别在于 json.dumps
调用 encode
,而 json.dump
调用 iterencode
,您尚未覆盖。原因大概是,如果您将整个结果存储在内存中,迭代编码就没有用了。
查看source code for JSONEncode
,似乎 encode
实际上调用了 iterencode
,因此,根据您想要实现的目标,覆盖该代码可能更有意义:
def iterencode(self, obj, **kwargs):
obj['__key'] += 1
return super().iterencode(obj, **kwargs)
关于python - 为什么 json.dump 和 json.dumps 的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74044326/