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

如何根据指定Key列表过滤JSON数据并生成新JSON文件?

解决方案

直接用递归遍历嵌套JSON结构,过滤出指定键的键值对,同时保留必要的父结构来承载嵌套的匹配项,代码如下:

import json

def filter_nested_json(data, target_keys_set):
    # 处理字典类型
    if isinstance(data, dict):
        filtered = {}
        for key, value in data.items():
            processed_val = filter_nested_json(value, target_keys_set)
            # 保留两种情况:当前键在目标集合,或子结构处理后非空
            if key in target_keys_set or (processed_val not in [{}, [], None] and processed_val is not False):
                filtered[key] = processed_val
        return filtered
    # 处理列表类型
    elif isinstance(data, list):
        filtered_list = []
        for item in data:
            processed_item = filter_nested_json(item, target_keys_set)
            # 保留有意义的处理结果,过滤空结构
            if processed_item not in [{}, [], None] or isinstance(processed_item, (bool, int, float, str)):
                filtered_list.append(processed_item)
        return filtered_list
    # 基础类型直接返回
    else:
        return data

if __name__ == "__main__":
    # 替换成你的目标键列表
    target_keys = ['session_id','following_status','job_name','last_interaction']
    # 转成集合提升大量键时的查找效率
    target_keys_set = set(target_keys)
    
    # 读取原始JSON文件
    with open('input.json', 'r', encoding='utf-8') as f:
        original_data = json.load(f)
    
    # 执行过滤
    filtered_data = filter_nested_json(original_data, target_keys_set)
    
    # 写入结果到新JSON文件
    with open('output.json', 'w', encoding='utf-8') as f:
        json.dump(filtered_data, f, indent=2, ensure_ascii=False)

关键说明

  1. 递归遍历:自动处理任意层级的嵌套字典和列表,不用手动写多层循环
  2. 效率优化:把目标键转成集合,100-1000个键的场景下,in操作从O(n)变成O(1),速度快很多
  3. 结构保留:不会直接砍掉包含匹配子键的父结构,比如原JSON里user_info键不在目标列表,但它的子键following_status在,会保留user_info这个父键和对应的子结构
  4. 空结构过滤:列表里处理后为空的元素会被自动过滤,避免最终结果里出现空字典/空列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:31:00