gpt4 book ai didi

python - 错误的 JSON - 键未被引用

转载 作者:太空狗 更新时间:2023-10-29 22:02:13 25 4
gpt4 key购买 nike

我正在从 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(...)
  2. 在冒号后添加一个空格 (:)。然后用 yaml.load(...) 解析。

我的猜测是选项 2 优于选项 1。但是,我正在寻求更好解决方案的建议。

有没有人遇到过像这样的格式错误的 JSON 并使用 Python 来解析它?

最佳答案

你有一个 HJSON document , 此时您可以使用 hjson project解析它:

>>> import hjson
>>> hjson.loads('{javascript_style:"Look ma, no quotes!"}')
OrderedDict([('javascript_style', 'Look ma, no quotes!')])

HJSON 是 JSON,不需要引用对象名称,甚至不需要引用某些字符串值,添加了注释支持和多行字符串,并且在应该使用逗号的地方有宽松的规则(包括根本不使用逗号)。

或者您可以安装并使用 demjson library ;它支持解析有效的 JavaScript(缺少引号):

import demjson

result = demjson.decode(jsonp_payload)

只有当您设置 strict=True 标志时,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')

使用正则表达式,您可以尝试将正则表达式转换为有效的 JSON;然而,这可能会导致误报。模式将是:

import re

valid_json = re.sub(r'(?<={|,)([a-zA-Z][a-zA-Z0-9]*)(?=:)', r'"\1"', jsonp_payload)

这匹配 {,,后跟一个 JavaScript 标识符(一个字符,后跟更多字符或数字),然后直接跟一个 : 冒号。如果您引用的值包含任何此类模式,您将获得无效的 JSON。

关于python - 错误的 JSON - 键未被引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34812821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com