python中的json.dump()和json.dumps()有啥区别?

Posted

技术标签:

【中文标题】python中的json.dump()和json.dumps()有啥区别?【英文标题】:What is the difference between json.dump() and json.dumps() in python?python中的json.dump()和json.dumps()有什么区别? 【发布时间】:2016-07-03 17:18:17 【问题描述】:

我在this官方文档中搜索了python中json.dump()和json.dumps()的区别。很明显,它们与文件写入选项有关。 但是它们之间的详细区别是什么?在什么情况下一个比另一个更有优势?

【问题讨论】:

【参考方案1】:

除了文档说的内容之外,没有其他要添加的内容。如果您想将 JSON 转储到文件/套接字或其他任何内容中,那么您应该使用 dump()。如果您只需要它作为字符串(用于打印、解析或其他),请使用dumps()(转储字符串)

正如Antti Haapala in this answer 所述,ensure_ascii 的行为存在一些细微差别。这主要是由于底层的write() 函数是如何工作的,因为它对块而不是整个字符串进行操作。查看他的答案以获取更多详细信息。

json.dump()

将 obj 序列化为 JSON 格式的流到 fp(支持 .write() 的类似文件的对象

如果 ensure_ascii 为 False,则写入 fp 的某些块可能是 unicode 实例

json.dumps()

将 obj 序列化为 JSON 格式的 str

如果 ensure_ascii 为 False,则结果可能包含非 ASCII 字符,返回值可能是 unicode 实例

【讨论】:

你能举例说明如何使用 dump() 通过套接字发送吗?我知道我可以使用 dumps() 而不是 encode() 来转换为字节,但是有没有更短的方法? dump(或with opendump)是异步的,还是dump(或with opendump)会在继续执行脚本之前完全完成执行? 【参考方案2】:

带有s 的函数采用字符串参数。其他人拿文件 流。

【讨论】:

【参考方案3】:

在内存使用和速度方面。

当您调用jsonstr = json.dumps(mydata) 时,它首先在内存中创建数据的完整副本,然后您才将file.write(jsonstr) 复制到磁盘。因此,这是一种更快的方法,但如果您要保存大量数据,则可能会出现问题。

当你调用json.dump(mydata, file) -- 没有's'时,新的内存不会被使用,因为数据是由块转储的。但整个过程大约慢了 2 倍。

来源:我检查了json.dump()json.dumps() 的源代码,还测试了两个变体,用time.time() 测量时间并观察htop 中的内存使用情况。

【讨论】:

【参考方案4】:

Python 2 的一个显着区别是,如果您使用 ensure_ascii=Falsedump 将正确地将 UTF-8 编码数据写入文件(除非您使用 8 位字符串非 UTF-8 的扩展字符):

另一方面,dumps ensure_ascii=False 可以产生 strunicode ,这取决于您用于字符串的类型:

使用此转换表将 obj 序列化为 JSON 格式的 str。如果 ensure_ascii 为 False,则结果可能包含非 ASCII 字符,并且返回值可能是 unicode 实例

(强调我的)。请注意,它也可能仍然是 str 实例。

因此你不能使用它的返回值将结构保存到文件中而不检查哪个 格式被返回并可能在使用unicode.encode

这当然在 Python 3 中不再有效,因为不再存在这种 8 位/Unicode 混淆。


对于load vs loadsload整个文件视为一个 JSON 文档,因此您不能使用它从单个文件中读取多个换行限制的 JSON 文档。

【讨论】:

在 python 字符串对象中创建的所有文本都是 unicode,但一般假设它是否安全?即从文件加载内容时? @JoãoGonçalves 这意味着您不能将二进制数据与文本混合,以便 python 默默地批准它。例如json.dumps([b'123']) -> TypeError. @JoãoGonçalves 还注意到 JSON 文档中的字符串必须是 Unicode,并且 必须是 UTF-8、UTF-16 中的任何一个或根据 RFC 7159 的 UTF-32 感谢您的解释!有道理 dump(或with opendump)是异步的,还是dump(或with opendump)会在继续执行脚本之前完全完成执行?

以上是关于python中的json.dump()和json.dumps()有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

python中json.dump() 和 json.dumps() 有那些区别?

Python JSON dump ,load,dumps,loads

python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分

python中json.dumps()和json.dump() 以及 json.loads()和json.load()的区分

python json.dumps() json.dump()的区别

python中json库中的loadloadsdumpdumps的区别与用法