如何正确解析包含重复键的JSON文件并提取所有event字段数据
问题分析
你提供的原始JSON不符合标准规范,存在两个核心问题:
- 单个JSON对象内不允许出现重复键名:外层
result键重复,每个result对象内的event键也重复。按照标准JSON解析规则,重复键会被后续值直接覆盖,最终仅会保留最后一个result和每个result下最后一个event的内容,常规方法无法拿到全部数据。
首先你需要先修正JSON结构,将重复键改为数组形式,修正后的标准结构参考如下:
{ "result": [ { "event": [ {"date": "12/12/13", "desc": "test1"}, {"date": "12/12/14", "desc": "test2"}, {"date": "12/12/15", "desc": "test3"} ] }, { "event": [ {"date": "12/12/13", "desc": "test5"}, {"date": "12/12/14", "desc": "test6"}, {"date": "12/12/15", "desc": "test7"} ] } ] }
提取方案
假设你已经修正为上述标准JSON结构,不同场景下的提取方法如下:
方法1:使用jq命令(Linux/Mac终端场景)
如果JSON内容保存在data.json文件中,直接执行以下命令即可输出所有date和desc对应内容:
jq '.result[] | .event[] | {date, desc}' data.json
方法2:Python代码实现
import json # 读取JSON文件 with open("data.json", "r", encoding="utf-8") as f: data = json.load(f) # 提取所有date和desc result_list = [] for res_item in data["result"]: for event_item in res_item["event"]: result_list.append({ "date": event_item["date"], "desc": event_item["desc"] }) # 输出结果 for item in result_list: print(item)
方法3:JavaScript代码实现
// data为已解析完成的JSON对象 const resultList = [] data.result.forEach(resItem => { resItem.event.forEach(eventItem => { resultList.push({ date: eventItem.date, desc: eventItem.desc }) }) }) console.log(resultList)
无法修改原始JSON的特殊场景
如果上游系统问题无法修改JSON结构,可直接将原始内容作为字符串,通过正则匹配提取所有date和desc的值,Python示例代码如下:
import re with open("raw.json", "r", encoding="utf-8") as f: raw_content = f.read() dates = re.findall(r'"date":\s*"([^"]+)"', raw_content) descs = re.findall(r'"desc":\s*"([^"]+)"', raw_content) result = list(zip(dates, descs)) print(result)
内容的提问来源于stack exchange,提问作者Yevhenii Chykalov
相关产品推荐
相关产品推荐

