Python的simplejson无法解析简单的json字符串

3 投票
4 回答
3531 浏览
提问于 2025-04-17 14:48

我在尝试解析一个非常简单的从网上获取的json字符串:{"price" : '10.25'}。如你所见,数字(10.25)是用单引号括起来的,这似乎对简单的json来说是个问题。

重现步骤:

import simplejson as json
json_str = """ {"price" : '10.25'} """
json.loads(json_str)

结果:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/pymodules/python2.5/simplejson/__init__.py", line 307, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 335, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/pymodules/python2.5/simplejson/decoder.py", line 353, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

不过,如果我把单引号换成双引号,它就能正常工作了。可惜的是,我得到的json数据并不像上面的例子那么简单,所以我不能仅仅用字符串替换命令把所有单引号都换掉。

有没有人知道解析这个json的正确方法是什么?

附注:我使用的是python 2.5。

非常感谢!

4 个回答

0

如果值只是数字,就不需要加引号;如果是其他类型的值,就要用双引号包起来。所以正确的写法是:

import simplejson as json
json_str = """ {"price" : 10.25} """
json.loads(json_str)

要替换它,你可以用一些正则表达式来解析这个json字符串,比如使用finditer。

0

单引号在JSON中是不合法的,所以simplejson的表现是完全正确的。问题出在你收到的JSON数据上,遗憾的是。我想不出有什么情况是用一点正则表达式的技巧不能帮你找到并替换掉需要的单引号的。

3

{"price" : "10.25"},JSON格式中只使用双引号。

使用单引号的JSON是无效的(可以查看:www.jsonlint.com):

Parse error on line 2:
{    "price": '10.25'}
--------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['

你可以通过正则表达式替换来修正你的JSON,或者使用ast.literal_eval将其加载为Python对象(或者将其转储为JSON再加载一次)。

>>> a = """ {"price" : '10.25'} """
>>> import ast
>>> new_dict = ast.literal_eval(a.strip())
>>> import json
>>> json.dumps(new_dict)
'{"price": "10.25"}'

撰写回答