一尘不染

通过Python的eval()运行JSON?

json

除了最佳做法,是否有令人信服的理由 这样做?

我正在编写一个与Google
Code项目一起使用的提交后挂钩,该项目通过JSON对象提供提交数据。GC随请求(JSON数据之外)一起提供了HMAC身份验证令牌,因此通过验证该令牌,我对JSON数据既是良性的(因为不信任Google毫无意义)也很有把握。

我自己的(简短的)调查表明,JSON完全是有效的Python,除了"\/"转义序列(GC似乎没有生成)外。

因此,当我使用Python 2.4(即没有json模块)时,eval()看起来 确实 很诱人。

编辑: 记录下来,我 不是 问这是个好主意。我
清楚它不是,而且我非常怀疑我是否会在以后的任何项目中使用这种技术,即使最终将其用于此项目。我只是想确保自己知道如果遇到这种麻烦。:-)


阅读 293

收藏
2020-07-27

共1个答案

一尘不染

如果您对脚本可以在一段时间内正常工作感到满意,然后在某些晦涩的边缘情况下随机失败,我将使用eval。

如果您的代码要健壮很重要,那么我会花时间添加simplejson。您不需要C部分来加快速度,因此确实不难将一些.py文件转储到某个目录中。

例如,JSON会使用Unicode,而simplejson返回Unicode,而eval返回str:

>>> simplejson.loads('{"a":1, "b":2}')
{u'a': 1, u'b': 2}
>>> eval('{"a":1, "b":2}')
{'a': 1, 'b': 2}

编辑:eval()表现不同的一个更好的示例:

>>> simplejson.loads('{"X": "\uabcd"}')
{u'X': u'\uabcd'}
>>> eval('{"X": "\uabcd"}')
{'X': '\\uabcd'}
>>> simplejson.loads('{"X": "\uabcd"}') == eval('{"X": "\uabcd"}')
False

编辑2:今天看到了SilentGhost指出的另一个问题:eval无法正确处理true-> True,false-> False,null-> None。

>>> simplejson.loads('[false, true, null]')
[False, True, None]
>>> eval('[false, true, null]')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'false' is not defined
>>>
2020-07-27