Python中是否有方法能忽略不标准的 json 数据中的键值对呢?
爬虫抓下来的一些 json 数据,大概每条有 1M 左右大,结构比较复杂,直接扔 mongodb 了,但是会出现一种情况,就是 mongodb 不允许 json 中的 key 带"."这样的符号 ,有没有什么方法能快速过滤掉这些不符合规则的键值对呢?
Python中是否有方法能忽略不标准的 json 数据中的键值对呢?
8 回复
直接全局替换成别的符号?
import json
import re
def parse_flexible_json(json_str):
"""
解析不标准JSON字符串,自动忽略格式错误的部分
处理方式:
1. 修复常见的JSON格式问题(如单引号、尾随逗号)
2. 逐行解析,跳过无法解析的行
"""
# 预处理:替换单引号为双引号,移除尾随逗号
json_str = json_str.replace("'", '"')
json_str = re.sub(r',\s*}', '}', json_str)
json_str = re.sub(r',\s*]', ']', json_str)
result = {}
lines = json_str.strip().split('\n')
for line in lines:
line = line.strip()
if not line or line.startswith('//'): # 跳过空行和注释
continue
# 尝试解析单行键值对
try:
# 包裹成合法JSON对象
wrapped = '{' + line + '}'
parsed = json.loads(wrapped)
result.update(parsed)
except json.JSONDecodeError:
# 如果单行解析失败,尝试提取键值对模式
match = re.match(r'"?(\w+)"?\s*:\s*(.+)', line)
if match:
key = match.group(1)
value_str = match.group(2).rstrip(',')
# 尝试解析值
try:
value = json.loads(value_str)
except:
# 如果值不是标准JSON,保持字符串形式
value = value_str.strip('"\'')
result[key] = value
return result
# 示例:处理不标准JSON
bad_json = """
{
'name': 'John',
age: 30, // 缺少引号的键
"hobbies": ["reading", "coding", ],
extra_field: some_value,
"valid": true,
invalid_field: [1, 2, 3,,],
}
"""
parsed = parse_flexible_json(bad_json)
print(json.dumps(parsed, indent=2))
核心思路:
- 先用正则预处理常见格式问题(单引号、尾随逗号)
- 逐行尝试解析,失败时用正则提取键值对
- 对值部分单独处理,解析失败时保留原始字符串
替代方案:
- 用
demjson3库:pip install demjson3
import demjson3
result = demjson3.decode(bad_json)
总结建议:预处理加逐行容错解析最稳妥。
似乎不太合适 ,主要是遍历起来可能会比较耗时,有可能这个 key 在 第 n 层…
转成字符串存进去。2333
先转换成字符串,再在字符串中找到 “.”: 这样的把里面的 . 去掉。一般就是用正则或者自定义一些字符串处理模式。然后再转回 json 存 mongo 就好。
转成 json 串再正则替换?
感谢 之前也是考虑到用正则 不过这个 json 不小,处理起来比较耗时
刚才看了下 mongodb 已经支持带.的 key 了 看了下是 pymongo 里还有 key 的拼写检查,把 pymongo 的 key 检查改 False 就 ok 了
最近也在搞类似的东西,最后生成的 json 有点大,一不小心点开之后 vscode 扩展直接就崩了,sublime 倒还能挺住。

