我正在从AWS(从javascript文件中)抓取一些JSONP字典。在仅解析了类似于JSON的数据的原始数据之后,在某些情况下,我获得了有效的JSON,并且可以在Python(json_data = json.loads(json_like_data)
)中成功加载该数据。但是,某些Amazon的JSONP不包含其密钥周围的引号(请参阅下文)。
...
{type:"storageCurrentGen",sizes:
[{size:"i2.xlarge",vCPU:"4",ECU:"14",memoryGiB:"30.5",storageGB:"1 x 800 SSD",valueColumns:[{name:"linux",prices:{USD:"0.938"}}]},
{size:"i2.2xlarge",vCPU:"8",ECU:"27",memoryGiB:"61",storageGB:"2 x 800 SSD",valueColumns:[{name:"linux",prices:{USD:"1.876"}}]},
{size:"i2.4xlarge",vCPU:"16",ECU:"53",memoryGiB:"122",storageGB:"4 x 800 SSD",valueColumns:[{name:"linux",prices:{USD:"3.751"}}]},
...
对于JSONP,这仍然有效,因为它是有效的JavaScript语法。但是,Python的json.loads(json_str)
无效,因为它无效JSON。
[还有另一个Python模块YAML,它可以处理未加引号的键,但分号(:
)后必须有一个空格。
我认为我有两个选择。
{
| ,
)和冒号(:
)之间的字符。然后使用json.loads(...)
。:
)之后添加一个空格。然后用yaml.load(...)
解析。我的猜测是选项2优于1。但是,我正在寻求更好解决方案的建议。
以前是否有人遇到过格式错误的JSON,并使用Python对其进行了解析?
您有一个HJSON document,这时您可以使用hjson
project进行解析:
hjson
[HJSON是JSON,不需要引用对象名称,甚至不需要某些字符串值,还添加了注释支持和多行字符串,并在应使用逗号的地方放宽了规则(包括根本不使用逗号)。
或者您可以安装并使用>>> import hjson
>>> hjson.loads('{javascript_style:"Look ma, no quotes!"}')
OrderedDict([('javascript_style', 'Look ma, no quotes!')])
;它支持解析有效的JavaScript(缺少引号):
demjson
library
仅当设置demjson
标志时,import demjson
result = demjson.decode(jsonp_payload)
才会拒绝解析您的输入:
strict=True
使用正则表达式,您可以尝试使用正则表达式将其合法化为有效JSON;但是,这会导致误报。模式将是:demjson
此匹配>>> import demjson >>> demjson.decode('{javascript_style:"Look ma, no quotes!"}') {u'javascript_style': u'Look ma, no quotes!'} >>> demjson.decode('{javascript_style:"Look ma, no quotes!"}', strict=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/demjson.py", line 5701, in decode return_stats=(return_stats or write_stats) ) File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/demjson.py", line 4917, in decode raise errors[0] demjson.JSONDecodeError: ('JSON does not allow identifiers to be used as strings', u'javascript_style')
或import re valid_json = re.sub(r'(?<={|,)([a-zA-Z][a-zA-Z0-9]*)(?=:)', r'"\1"', jsonp_payload)
,后跟JavaScript标识符(一个字符,后跟更多字符或数字),然后直接跟一个{
冒号。如果您引用的值包含任何此类模式,则将获得无效的JSON。