You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效过滤千条记录的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
]

方案优势

  1. 代码简洁:一行推导式完成逻辑,可读性强,无需编写大量删除判断
  2. 效率更高:仅遍历需要保留的键,避免逐个处理要删除的键,减少循环次数
  3. 无副作用:生成全新的字典,不会修改原数据,避免影响其他依赖原数据的逻辑
  4. 扩展性好:只需修改required_keys集合,即可调整保留的键,无需修改循环内的删除逻辑

内容的提问来源于stack exchange,提问作者ditil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:05:45