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))

核心思路

  1. 先用正则预处理常见格式问题(单引号、尾随逗号)
  2. 逐行尝试解析,失败时用正则提取键值对
  3. 对值部分单独处理,解析失败时保留原始字符串

替代方案

  • 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 倒还能挺住。

回到顶部