我尝试解析一个从网上得到的非常简单的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
但是,如果我将单引号更改为双引号 - 它可以正常工作。 不幸的是,我得到的jsons并不像上面的例子那么简单,所以我不能用string replace命令替换所有单引号。
有谁知道解析这个json的正确方法是什么?
P.S。我使用python 2.5。
非常感谢!
答案 0 :(得分:3)
{"price" : "10.25"}
,JSON仅包含双引号。
带单引号的JSON无效(请参阅:www.jsonlint.com):
Parse error on line 2:
{ "price": '10.25'}
--------------^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['
您可以使用regex replace更正您的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"}'
答案 1 :(得分:0)
单引号是无效的JSON所以simplejson正在做它应该是什么。不幸的是,问题是你收到的JSON。我无法看到一个小正则表达式无法帮助您找到并替换您需要的单引号的情况。
答案 2 :(得分:0)
如果只是数字或双引号,则不应引用该值。所以正确的方法是:
import simplejson as json
json_str = """ {"price" : 10.25} """
json.loads(json_str)
要替换它,你可以使用例如一些regluar表达式解析json字符串。 finditer
答案 3 :(得分:0)
在json.org检查有效的JSON格式。
正如您所看到的,只有双引号对字符串(字典的键)有效。