3

我尝试解析从网上获得的一个非常简单的 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的正确方法是什么吗?

PS我使用python 2.5。

非常感谢!

4

4 回答 4

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"}'
于 2013-02-05T09:52:22.540 回答
0

单引号不是有效的 JSON,所以 simplejson 正在做它应该做的事情。不幸的是,问题是您收到的 JSON。我看不到一点 regex-fu 无法帮助您查找和替换您需要的单引号的情况。

于 2013-02-05T09:52:44.653 回答
0

如果只有数字或应该双引号,则不应引用该值。所以正确的做法是:

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

并且要替换它,您可以使用例如 finditer 用一些正则表达式解析 json 字符串

于 2013-02-05T09:54:00.390 回答
0

在json.org检查什么是有效的 JSON 格式。

如您所见,只有双引号对字符串(字典键)有效。

于 2013-02-05T09:58:54.570 回答