what's the difference between python objects and json objects?
从表面上看,Python本机使用JSON。我能想到的唯一例外是JSON可以存储JS函数。
我的问题是:我需要通过终端将JSON传递给一个python文件。为什么我应该或不应该只使用eval()?
- "看来Python本机使用JSON"?因为有一个单独的json库,所以我根本不知道这个声明。似乎有一个单独的库表明JSON不是Python语法的第一类部分。
- 实际上,问题应该类似于"python对象文本语法和json有什么区别?"另外,不要使用eval-stackoverflow.com/a/1832957/397719
- 感谢您的回答@spacedmonkey。我在Twitter上看了一个人的演讲(我相信)讨论了json.parse()在某些情况下是如何回归到eval的,以及经验法则如何只是经验法则。但是对于像我这样不想调查所有怪异细节的人来说,不使用eval是正确的方法。
- 在这种情况下,我不确定"通过终端将JSON传递到python文件"的确切含义,但是如果您不控制eval的字符串,可能会使自己容易受到代码注入的攻击。
不,python本机不使用json。实际上,您认为JSON是一个字典,是Python中多种对象之一。在Python中构建字典的(简单)语法与JSON非常接近,但它是偶然的。正如您可以这样创建字典:
您也可以这样创建它:
1
| a = dict([('a', 2), ('b', 3)]); |
号
那么,什么语法如此相似呢?好吧,JSON语法的灵感来自于数组的JavaScript语法。JavaScript语法可能也启发了编写Python字典的方式,反之亦然。但决不要假定这三种语法(javascript、json和python dicts)是相同或可互换的。
既然如此,为什么不应该在字典中使用eval()来转换json?首先,由于eval()可以在python中执行任何操作,例如退出程序、删除文件、更改一些内部数据等。因此,通过使用eval(),您可能会使自己容易受到代码注入的攻击,这取决于您如何使用它。另外,使用eval()将json转换为dict时,假定两者的语法相同,但这不一定是正确的;即使语法相同,它们将来也不会相同。最后,还有一种更好、更实用的方法来解析JSON:json模块:
1 2 3
| >>> import json
>>> json.loads('{"a":1}')
{'a': 1} |
使用它来解析JSON。
祝你好运!
JSON本身没有对象,不能存储JavaScript函数。它的语法可能看起来类似于javascript文本,但是一直试图这样使用它只会带来痛苦。
而且不需要使用eval();javascript和python都有随时可用的JSON解析器和序列化器。
- 您忘记了这些信息:docs.python.org/library/json.html
- 在python中使用eval()似乎比导入额外的JSON库来解析序列化数据容易得多。看起来效果不错,但我应该注意什么?
- 你应该注意的是,eval()将接受非json的东西。
- 除此之外,我只想知道不同之处。python数据:{'a':'b'},json数据:{'a':'b'}…有什么区别?
- 后者不是JSON,因为它不是字符串。
- 哦,好吧,我想我现在可能明白你的意思了。这很微妙,但是的。
- 也许你可以这样回答我:如果在python中我放了a = {'b':'c'},那么我就不能把str(a)序列化为json吗?看起来不错
- @斯蒂芬:一般来说?不,在那个特定的情况下,它正好解决了。
- @为什么不呢?有什么区别?你能给我找个反例吗?
- 江户十一〔七〕号
- 好的,谢谢!这很有道理,我只是想看看。
- 这里的评论很有启发性!