如何使用正则表达式合并JSON中多个同名item字段值为数组
解决方案
首先明确前提:你拿到的输入不符合标准JSON规范,标准JSON不允许同级存在同名字段,常规JSON解析器会自动覆盖重复字段仅保留最后一个取值,因此只能通过字符串正则预处理的方式处理。
你之前写的正则硬编码了3组item字段的匹配规则,只能适配恰好3个重复字段的场景,换成全局匹配收集所有取值的方式即可适配任意数量的同名字段。
通用正则逻辑
不需要固定长度的捕获组,开启正则全局匹配模式后,用以下规则匹配所有item字段:
- 匹配正则:
"item":"([^"]*)" - 逻辑说明:全局模式下该正则会依次匹配每一个
item字段,捕获组1对应每个item的取值,把所有捕获到的取值收集到数组中,最后拼接成你需要的"item": ["val1","val2",...]格式即可。
代码示例(Python)
仅提取合并后的item字段
import re # 示例输入 raw_str = '{"item":"A","item":"B","item":"C"}' # 全局匹配所有item的取值 item_values = re.findall(r'"item":"([^"]*)"', raw_str) # 生成目标格式 result = f'"item": {str(item_values).replace("'", '"")}' print(result) # 输出:"item": ["A","B","C"]
保留其他字段,整串转换为标准JSON
如果输入中还有其他非重复字段,需要整体转换为合法JSON,可以用以下方式实现:
import re from collections import defaultdict # 带其他字段的示例输入 raw_str = '{"id":"123","item":"A","item":"B","name":"test","item":"C"}' fields = defaultdict(list) # 匹配所有键值对 for match in re.finditer(r'"([^"]+)":"([^"]*)"', raw_str): key, value = match.groups() fields[key].append(value) # 组装标准JSON res_parts = [] for key, values in fields.items(): if len(values) == 1: res_parts.append(f'"{key}":"{values[0]}"') else: res_parts.append(f'"{key}":{str(values).replace("'", '"')}') final_standard_json = "{" + ",".join(res_parts) + "}" print(final_standard_json) # 输出:{"id":"123","item":["A","B","C"],"name":"test"}
注意:如果你的
item取值里包含转义的双引号(比如"item":"a\"b"),把匹配取值的部分替换为"((?:\\.|[^"\\])*)"即可适配转义场景。
内容的提问来源于stack exchange,提问作者Sari Abuzahra
相关产品推荐
相关产品推荐

