我有一个字典,它作为字符串存储在db字段中。我正试图将它解析为一个dict,但是json.loads
给了我一个错误。
为什么json.loads
在这个问题上失败了,而ast.literal_eval
起作用了?一个比另一个更好吗?
>>> 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'}
发布于 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表达式作为要计算的输入。
一个比另一个更好吗?
这取决于数据。有关更多上下文,请参见此回答。
发布于 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是这里适用的标准,您将从使用它中获益。
发布于 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
并不容易移植,但它稍微丰富了一点:例如,您可以使用键不限于字符串的元组、集合和数据集。
https://stackoverflow.com/questions/28403744
复制相似问题