JSON.stringify (Javascript) 和 json.dumps (Python) 在列表上不等同?

73
在JavaScript中:
var myarray = [2, 3];
var json_myarray = JSON.stringify(myarray) // '[2,3]'

但在Python中:

import json 
mylist = [2, 3]
json_mylist = json.dumps(mylist) # '[2, 3]' <-- Note the space

所以这两个函数并不相等。对我来说有点意外,如果想要比较一些数据可能会有点问题。

能否解释一下原因?


1
如果您要精确比较已序列化的JSON值,那么您会如何处理对象键的排序? - Josh Lee
2
JSON允许在元素之间添加空格;Python的默认配置是包含该空格。你的实际目标是什么,是比较JSON的还是比较由两者生成的确切字节?如果是后者,你将会遇到更多问题,例如JSON对象中键值对的顺序不被设置。 - Martijn Pieters
1
输出结果是等价的,只是不完全相同。JSON在编码相同数据时具有一定的灵活性,它并不强制要求使用规范形式。空格就是一个例子,字符串中使用\u转义字符则是另一个例子。 - skirtle
我可以将JSON字符串转换为列表对象并进行比较,但我发现直接进行比较更加直接。JSON字符串存储在数据库中,表示我正在搜索的ForeignKey字段(Django框架)。 (排序很重要)。 - ThePhi
1个回答

110

区别在于json.dumps默认应用了一些微小的漂亮打印,而JSON.stringify则没有。

要像JSON.stringify一样删除所有空格,您需要指定分隔符

json_mylist = json.dumps(mylist, separators=(',', ':'))

2
它可能仅适用于简单的数组。带有对象的数组仍会产生不同的校验和,因此它们不同(它们有额外的字符)。 - Marek Marczak
1
为了使其缩进,可以使用indent = indent_size参数。 - Ayan

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