【发布时间】:2015-04-08 20:05:02
【问题描述】:
我有一个字典,它作为字符串存储在 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'}
【问题讨论】:
-
如果能将此问题作为本主题的规范问题,那就太好了(因为它不断被问到,无论是隐含的还是明确的)。但是,由于 OP 提供的 JSON 实际上是非法/格式错误的,因此部分答案是否应该考虑“ 对非法/格式错误的 JSON 有多宽容?” (类似于在抓取 XML/HTML/CSS 上的 BeautifulSoup vs lxml?)。例如,这里的 OP 是否应该使用正则表达式来修复/预处理不需要的和非法的
u'前缀? (这只是在接近 EOL 的 Python 2.x 中会出现的问题)。然后直接使用json.loads,已经? -
如果数据库仍然包含从 Python 2.x 以错误方式导出的非法/格式错误的 JSON,那么这个问题就变得不那么规范了。
标签: python json parsing abstract-syntax-tree