python - 为什么 json.dump 和 json.dumps 的行为不同?

标签 python json serialization

我使用自定义 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}

但是当我取消注释注释行(这是我最终想要做的事情所必需的,因为我不想更改原始数据)时,dumpsdump 表现不同:

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/

相关文章:

python - 3/2 和 -3/2 有什么区别?

javascript - JSON obj 到 javascript 中的动态多维数组

json - 使用 JSON 从巨大的字符串中解码少量数据

c# - 文档存储序列化

python - 如何在python中通过paaver安装模块?

python - python数组括号中的可比较数学符号

python - Python 中两个具有重复项的列表之间的区别

python - 使用 cattrs 解构复杂的类

java - java 的 File 类的对象是可序列化的吗?

c# - ASP.NET *.resx 序列化