python - 在 Python 中处理惰性 JSON - 'Expecting property

使用 Pythons (2.7) 'json' 模块我正在寻找处理各种 JSON 提要。不幸的是,其中一些提要不符合 JSON 标准 - 具体而言,某些键未包含在双语音标记 (") 中。这导致 Python 出错。

在编写一段丑陋的代码来解析和修复传入数据之前,我想我会问 - 有没有办法让 Python 解析这个格式错误的 JSON 或“修复”数据,以便它会是有效的 JSON 吗?

工作示例

import json
>>> json.loads('{"key1":1,"key2":2,"key3":3}')
{'key3': 3, 'key2': 2, 'key1': 1}

破例

import json
>>> json.loads('{key1:1,key2:2,key3:3}')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\json\__init__.py", line 310, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 346, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 362, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)

我已经编写了一个小的 REGEX 来修复来自这个特定提供商的 JSON,但我认为这将成为 future 的一个问题。以下是我想出的。

>>> import re
>>> s = '{key1:1,key2:2,key3:3}'
>>> s = re.sub('([{,])([^{:\s"]*):', lambda m: '%s"%s":'%(m.group(1),m.group(2)),s)
>>> s
'{"key1":1,"key2":2,"key3":3}'

最佳答案

您正在尝试使用 JSON 解析器来解析不是 JSON 的内容。最好的办法是让提要的创建者修复它们。

我知道这并不总是可能的。您也许可以使用正则表达式修复数据,具体取决于数据的损坏程度:

j = re.sub(r"{\s*(\w)", r'{"\1', j)
j = re.sub(r",\s*(\w)", r',"\1', j)
j = re.sub(r"(\w):", r'\1":', j)

关于python - 在 Python 中处理惰性 JSON - 'Expecting property name',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033633/

相关文章:

python - 如何计算 JSON 数据中的项目

json - 你能推荐我一个 json 查看器应用程序吗?

java - Spring MVC PATCH方法: partial updates

javascript - 将返回的 JSON 对象属性转换为(较低的第一个)camelCase

ruby-on-rails - 无法在 Ubuntu 上使用 ruby​​ 2.2.3 安装 jso

javascript - jQuery AJAX 轮询 JSON 响应,基于 AJAX 结果或 JS

json - 在 Go : required field? 中解码 json

json - 当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印

json - 如何与 Telegram API 交互

javascript - 为什么 Google 在前面加上 while(1);到他们的 JSON 响