JSON数据过滤异常:过滤后output.json为空问题求助
JSON数据过滤异常排查与解决方法
常见问题排查方向
- 大小写匹配问题:过滤规则里的词汇(比如
zonedentr、modifier sl)如果和JSON中message字段的实际大小写不一致(比如JSON里是ZonedEntr或Modifier SL),会直接导致匹配失败,建议改成不区分大小写的匹配逻辑。 - 空格/特殊字符干扰:比如规则里的
fermer le trade,若JSON文本是fermer le trade(多空格)或带标点(fermer le trade.),普通字符串匹配会失效,需用正则做模糊匹配。 - 正则语法错误:如果代码里用了正则,可能存在转义错误、分组逻辑错误,导致所有内容都无法匹配。
- JSON结构问题:确认原始JSON是数组格式,且每个对象都存在
message字段,避免因字段缺失导致过滤逻辑误判。
修正后的示例代码
import json import re # 定义匹配规则的正则表达式,忽略大小写 pattern1 = re.compile(r'(vente|sell|achat|buy).*zonedentr', re.IGNORECASE) pattern2 = re.compile(r'(pipsclture|pipscloture|pipclture|pipcloture)', re.IGNORECASE) pattern3 = re.compile(r'fermer(?:ez)? le trade', re.IGNORECASE) pattern4 = re.compile(r'modifier sl', re.IGNORECASE) def filter_valid_items(item): message = item.get('message', '') # 检查任一条件是否满足 return (pattern1.search(message) or pattern2.search(message) or pattern3.search(message) or pattern4.search(message)) # 读取原始数据 with open('input.json', 'r', encoding='utf-8') as f: raw_data = json.load(f) # 执行过滤 filtered_data = [item for item in raw_data if filter_valid_items(item)] # 写入结果 with open('output.json', 'w', encoding='utf-8') as f: json.dump(filtered_data, f, ensure_ascii=False, indent=2)
关键优化点
- 启用不区分大小写匹配(
re.IGNORECASE),规避大小写差异导致的匹配失效。 - 用
.*处理词汇间的任意字符,兼容空格、标点等干扰项。 - 用
item.get('message', '')处理缺失message字段的对象,避免代码报错。 - 合并相似规则的正则表达式,简化逻辑同时提升匹配效率。
验证步骤
- 从原始JSON中提取几个符合条件的
message字段,单独用正则测试是否能匹配成功。 - 运行代码前,打印
len(raw_data)和len(filtered_data),查看过滤前后的数据量变化,定位是完全无匹配还是匹配数量过少。 - 检查JSON文件编码是否为UTF-8,避免读取时乱码导致匹配失效。
内容的提问来源于stack exchange,提问作者Benjamin Perry
相关产品推荐
相关产品推荐

