首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在解析JSON时json.loads要比ast.literal_eval更好呢?

为什么在解析JSON时json.loads要比ast.literal_eval更好呢?
EN

Stack Overflow用户
提问于 2015-02-09 06:07:55
回答 6查看 17.2K关注 0票数 15

我有一个字典,它作为字符串存储在db字段中。我正试图将它解析为一个dict,但是json.loads给了我一个错误。

为什么json.loads在这个问题上失败了,而ast.literal_eval起作用了?一个比另一个更好吗?

代码语言:javascript
运行
复制
>>> c.iframe_data
u"{u'person': u'Annabelle!', u'csrfmiddlewaretoken': u'wTE9RZGvjCh9RCL00pLloxOYZItQ98JN'}"

# json fails
>>> json.loads(c.iframe_data)
Traceback (most recent call last):
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

# ast.literal_eval works
>>> ast.literal_eval(c.iframe_data)
{u'person': u'Annabelle!', u'csrfmiddlewaretoken': u'wTE9RZGvjCh9RCL00pLloxOYZItQ98JN'}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-02-09 06:16:04

json.loads失败,因为您的c.iframe_data值不是有效的JSON文档。在有效的json文档中,在双引号中引用字符串,并且没有类似于u的东西来将字符串转换为unicode。

使用json.loads(c.iframe_data)意味着在c.iframe_data中反序列化JSON文档

每当您需要ast.literal_eval来计算input表达式时,都会使用input。如果将Python表达式作为要计算的输入。

一个比另一个更好吗?

这取决于数据。有关更多上下文,请参见此回答

票数 14
EN

Stack Overflow用户

发布于 2019-03-10 10:39:39

我有一个字典,它作为字符串存储在db字段中。

这是设计上的错误。虽然提取字典的repr是完全有可能的,就像某些人所做的那样,但并不能保证对象的repr可以被计算。

在只有字符串键、字符串和数值的情况下,大多数情况下,Python函数将从它的repr中复制值,但我不确定为什么您认为这会使它成为有效的eval

我正试图将它解析为一个dict,但是json.loads给了我一个错误。

这很自然。您没有将JSON存储在数据库中,因此将其解析为JSON似乎不太合理。虽然可以使用ast.literal_eval解析值很有趣,但是除了相对简单的Python类型之外,没有任何保证。

由于您的数据确实仅限于这类类型,所以解决问题的真正方法是在数据库中存储之前将字典转换为带有json.dumps的字符串,从而纠正数据的存储方式。一些数据库系统(例如,PostgreSQL)有JSON类型使查询此类数据变得更简单,如果您可以使用这些类型,我建议您使用这些类型。

至于哪个“更好”,这将始终取决于特定的应用程序,但JSON被明确地设计为一种用于简单结构化数据的紧凑的人类可读的机器可解析格式,而您当前的表示则基于Python特有的格式,例如,在其他语言中很难对其进行评估。JSON是这里适用的标准,您将从使用它中获益。

票数 9
EN

Stack Overflow用户

发布于 2015-02-09 06:38:49

json.loads专门用于解析JSON,这是一种限制性很强的格式。没有u'...'语法,所有字符串都用双引号分隔,而不是单引号。使用json.dumps序列化json.loads可以读取的内容。

因此,json.loads(string)json.dumps(object)的逆,而ast.literal_eval(string)则是repr(object)的逆。

JSON很不错,因为它是可移植的--几乎每种语言都有用于它的解析器。因此,如果您想将JSON发送到Javascript前端,那么您将没有任何问题。

ast.literal_eval并不容易移植,但它稍微丰富了一点:例如,您可以使用键不限于字符串的元组、集合和数据集。

还有ast.literal_eval

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28403744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档