JSON语法是Python语法的严格子集吗?

19

JSON与Python语法非常相似。所有的JSON对象都可以直接转换成Python吗,而没有错误?

示例

以下是一个有效的JSON对象:

// Valid JSON
{"foo":"bar"}

这个对象会直接转换成一个Python字典,键名为"foo",键值为"bar":

# Python
json_dict = eval('{"foo":"bar"}')

1
如果你能举个例子,将 JSON 转换成 Python 代码,我会尽力回答你的问题。 - orkutWasNotSoBad
我不太了解Python,无法确定,但可能存在一些情况,Python解析JSON字符串与JSON规范不同。 - Jim Deville
3
@James:这个问题与解析JSON无关,而是与直接使用JSON有关。 - Ignacio Vazquez-Abrams
使用不受信任的 JSON 数据源肯定是不安全的。我经常在 Python 脚本之间复制和粘贴 JSON,以便我的代码与外部威胁隔离。这更多是关于方便性而非速度的问题。 - pokstad
2
还有ast.literal_eval,比eval更安全。 - FogleBird
显示剩余5条评论
2个回答

20

不是的。特别地,truefalsenull不属于Python语言,虽然它们在Python中都有直接的对应项(分别为TrueFalseNone)。

// Valid JSON
{"sky_is_blue":true}

但在Python中使用时...

# Python
>>> json_dict = eval('{"sky_is_blue":true}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'true' is not defined

1
+1 很好知道。这是不兼容性的全部内容吗?还是有很多其他JavaScript特定的东西Python不喜欢? - pokstad
字符串的解释方式(或缺乏规范)可能会有些模糊,但以下三个方面是最大的区别。 - Ignacio Vazquez-Abrams
1
@FogleBird:不,你没有;那不是 JSON。 - Ignacio Vazquez-Abrams
1
据我所知,这些是唯一不在Python中的严格 JSON值。像NaNInfinity这样的值并不是严格的JSON,但可能会在JSON字符串中找到(事实上,除非明确告知否则,Python的json模块将使用它们)。 - Thomas K
1
@Ignacio:你说得对。我想有时人们会像滥用HTML一样滥用JSON。 - FogleBird
显示剩余3条评论

6

这个问题已经得到解答(并且答案已被接受),但我想指出一个问题,即在Python中,truefalsenull不能直接使用。可以通过在评估JSON之前使用以下代码来解决:

true = True
false = False
null = None

当然,JSON解析器仍然更好。

我想知道这个能否与FogleBird提到的ast.literal_eval结合使用,以构建一个快速的纯Python JSON解析器。 - pokstad
并不是这样的,因为变量不是字面值,所以不被允许...尽管在传递给ast.literal_eval之前可以执行string.replace('true', 'True')等操作。当然,这会对{"Quote": "This sentence is false."}造成不良影响。 - Jasmijn
6
正则表达式?现在你有两个问题了!;) - Jasmijn

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