如何高效过滤千条记录的JSON,仅保留指定键值对?
问题
我有一份约1000条记录的JSON数据,结构如下(注:该JSON存在重复键updated_data,标准解析会丢失数据,实际使用需先修正结构):
{ "updated_data":{ "last_interaction": "2022-06-20 06:55:55.652434", "following_status": "followed", "session_id": "f594abec-3819-4461-9b6c-0df0f11cf382", "job_name": "blogger-following", "target": "name1", "liked": 21, "watched": 7, "commented": 0, "followed": false, "unfollowed": false, "scraped": false, "pm_sent": false }, "updated_data":{ "last_interaction": "2022-06-20 06:55:55.652434", "following_status": "followed", "session_id": "f594abec-3819-4461-9b6c-0df0f11cf382", "job_name": "blogger-following", "target": "name1", "liked": 21, "watched": 7, "commented": 0, "followed": false, "unfollowed": false, "scraped": false, "pm_sent": false } }
需要仅保留指定键列表['session_id','following_status','job_name','last_interaction']对应的键值对,生成数组格式的新JSON:
[ { "last_interaction": "2022-06-20 06:55:55.652434", "following_status": "followed", "session_id": "f594abec-3819-4461-9b6c-0df0f11cf382", "job_name": "blogger-following" }, { "last_interaction": "2022-06-20 06:55:55.652434", "following_status": "followed", "session_id": "f594abec-3819-4461-9b6c-0df0f11cf382", "job_name": "blogger-following" } ]
目前我用循环删除不需要的键的方式实现:
new_data = [] for jsonData in data: record_data = jsonData record_data_keys = record_data.keys() if 'target' in record_data_keys: del record_data['target'] # 省略其他键的删除逻辑 if 'pm_sent' in record_data_keys: del record_data['pm_sent'] new_data.append(record_data)
想问有没有更优、高效的实现方案?
更优实现方案
核心思路:直接构建目标字典,而非删除不需要的键
这种方式更简洁高效,尤其是当需要保留的键远少于要删除的键时,优势更明显,同时不会修改原数据,避免意外副作用。
步骤1:修正原始JSON的重复键问题
原始JSON存在重复的updated_data键,标准JSON解析器会只保留最后一个值,导致数据丢失。可以通过自定义解析逻辑提取所有重复键的值:
import json def extract_updated_data(pairs): records = [] for key, value in pairs: if key == 'updated_data': records.append(value) return records # 读取原始JSON文件 with open('your_data.json', 'r', encoding='utf-8') as f: raw_content = f.read() # 解析并获取所有记录 all_records = json.loads(raw_content, object_pairs_hook=extract_updated_data)
步骤2:生成目标数据
使用列表推导式+字典推导式,直接保留需要的键:
# 指定需要保留的键 required_keys = {'session_id', 'following_status', 'job_name', 'last_interaction'} # 生成新数据 new_data = [ {key: record[key] for key in required_keys} for record in all_records ]
如果担心部分记录可能缺失某个键,可以添加if key in record的判断:
new_data = [ {key: record[key] for key in required_keys if key in record} for record in all_records ]
方案优势
- 代码简洁:一行推导式完成逻辑,可读性强,无需编写大量删除判断
- 效率更高:仅遍历需要保留的键,避免逐个处理要删除的键,减少循环次数
- 无副作用:生成全新的字典,不会修改原数据,避免影响其他依赖原数据的逻辑
- 扩展性好:只需修改
required_keys集合,即可调整保留的键,无需修改循环内的删除逻辑
内容的提问来源于stack exchange,提问作者ditil
相关产品推荐
相关产品推荐

