我正在从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可以处理未加引号的键,但在引号后面必须有一个空格(:
)。
我想我有两个选择。
1.以某种方式替换开括号或逗号之间的字符({
| ,
)和冒号(:
)。然后使用json.loads(...)
。
1.在每个冒号后添加一个空格(:
)。然后使用yaml.load(...)
进行解析。
我认为选项2比选项1更好。不过,我正在寻求更好的解决方案。
有没有人遇到过这样的格式不好的JSON,并使用Python来解析它?
2条答案
按热度按时间pw136qt21#
你有一个HJSON document,此时你可以使用
hjson
project来解析它:HJSON是JSON,不需要引用对象名称,甚至不需要引用某些字符串值,添加了注解支持和多行字符串,并放宽了逗号使用的规则(包括根本不使用逗号)。
或者你可以安装并使用
demjson
library;它支持解析有效的JavaScript(缺少引号):只有当你设置了
strict=True
标志时,demjson
才会拒绝解析你的输入:使用正则表达式,你可以尝试用正则表达式的方式来获得有效的JSON;但是,这可能会导致误报。模式将是:
它匹配一个
{
或,
,后跟一个JavaScript标识符(一个字符,后跟多个字符或数字),并直接后跟一个:
冒号。如果引用的值包含任何此类模式,则会得到无效的JSON。cgvd09ve2#
你也可以用简单的正则表达式来实现(在这个特定的例子中):