Python中json.dump()和json.dumps()有什么区别?

193

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

4个回答

201
如果你想将JSON转储到文件、套接字或其他地方,那么你应该使用dump()。如果你只需要它作为一个字符串(用于打印、解析或其他操作),那么请使用dumps()(转储字符串)。
正如Antti Haapala在这个答案中提到的ensure_ascii的行为存在一些细微差别。这主要是由于底层的write()函数是按块而不是整个字符串进行操作的。请查看他的答案以获取更多详细信息。

json.dump()

将obj序列化为JSON格式的流写入fp(一个支持.write()方法的类文件对象)。
如果ensure_ascii为False,则写入fp的某些块可能是unicode实例。

json.dumps()

将obj序列化为JSON格式的字符串。 如果ensure_ascii为False,则结果可能包含非ASCII字符,并且返回值可能是一个Unicode实例。

你能举个例子来演示如何使用 dump() 通过套接字发送数据吗?我知道可以使用 dumps() 然后使用 encode() 转换为字节,但是否有更简短的方式呢? - Boy
dump(或 with opendump)是异步的,还是会在脚本继续执行之前完全执行完毕? - oldboy
1
我不明白,.dump 的具体用例是什么?为什么有人不想要它作为字符串? - Charlie Parker

48

关于内存使用和速度。

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

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

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


47

s 结尾的函数接受字符串参数,其他函数接受文件流或文件指针。


7
Python 2 中一个显著的不同之处是,如果你使用ensure_ascii=Falsedump 就会将 UTF-8 编码的数据正确地写入文件(除非你使用了带有未被编码为 UTF-8 的扩展字符的 8 比特字符串):
另一方面,dumps 搭配 ensure_ascii=False 可以根据你对字符串使用的类型生成一个 str 或者 unicode

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

(强调是我的)。请注意,它仍然可以是 str 实例。
因此,在保存结构到文件之前,你不能使用其返回值而不检查返回的是哪种格式并且可能需要使用 unicode.encode
当然,在 Python 3 中已经不存在这种 8 比特/Unicode 困惑,因此这不再是一个有效的问题了。
至于 loadloadsload 认为整个文件是一个 JSON 文档,因此你不能使用它从单个文件中读取多个以换行分隔的 JSON 文档。

Python字符串对象中创建的所有文本都是Unicode编码的,但是否可以通用地假设呢?例如从文件中加载内容时? - João Gonçalves
@JoãoGonçalves 这意味着您不能将二进制数据与文本混合在一起,以便Python默默地批准它。例如:json.dumps([b'123']) -> TypeError - Antti Haapala -- Слава Україні
@JoãoGonçalves 还要注意,JSON 文档中的字符串必须是 Unicode,并且必须符合 RFC 7159 中的 UTF-8、UTF-16 或 UTF-32 中的任何一种。 - Antti Haapala -- Слава Україні
1
谢谢你的解释!很有道理。 - João Gonçalves
dump(或 with opendump)是异步的,还是会在脚本继续执行之前完全执行完毕? - oldboy
已经完全完成,除非dump仍然可能在缓冲区中... - Antti Haapala -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接