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

如何用Python高效提取JSON文件中的指定字段值?

提取嵌套JSON数据的简化方案及通用处理思路

我正尝试从JSON文件的不同层级中提取数据,目前采用多层for循环的繁琐方式获取嵌套字典中的值。我需要提取所有"title"和"question"字段的值,将其存入列表或Pandas DataFrame中。请问有没有更简便的提取方法?以及如何高效处理JSON文件的通用方案?

JSON示例片段

{
    "contact": "xxx",
    "version": 1.0,
    "data": [
        {
            "title": "anges-musiciens-(national-gallery)",
            "paragraphs": [
                {
                    "qas": [
                        {
                            "answers": [{
                                    "text": "La Vierge aux rochers"
                                }
                            ],
                            
                            "question": "Que concerne principalement les documents ?"
                        }
                    ]
                }
            ]
        }
    ]
}

当前使用的代码

titles = []
questions = []

for i in data["data"]:
    titles.append(i["title"])

    for p in i["paragraphs"]:
        for q in p["qas"]:
            questions.append(q["question"])
    
print(titles)
print(questions)

一、简化提取的方法

1. 列表推导式替代多层循环

用列表推导式压缩嵌套循环逻辑,代码更紧凑,逻辑与原代码完全一致:

titles = [item["title"] for item in data["data"]]
questions = [q["question"] for item in data["data"] for p in item["paragraphs"] for q in p["qas"]]

2. Pandas json_normalize直接生成DataFrame

如果最终目标是存入DataFrame,json_normalize可以自动扁平化嵌套结构,还能保证title与question的对应关系:

import pandas as pd

# 扁平化嵌套结构,关联title和对应的question
df = pd.json_normalize(
    data["data"],
    record_path=["paragraphs", "qas"],  # 指定嵌套数组的路径
    meta=["title"]  # 关联外层的title字段
)
# 保留需要的列
result_df = df[["title", "question"]]

二、高效处理JSON文件的通用方案

  • 按需选择解析方式:小文件直接用json.load()读取为Python字典/列表;超大文件用ijson流式解析,逐段处理避免内存溢出。
  • 明确字段层级路径:提前梳理目标字段的层级(比如data -> [] -> title、data -> [] -> paragraphs -> [] -> qas -> [] -> question),所有提取逻辑围绕路径展开。
  • 增加异常防护:实际场景中可能存在字段缺失,用item.get("title", "")替代item["title"],避免KeyError中断程序。
  • 封装通用提取函数:针对重复的JSON结构提取需求,封装函数复用逻辑,比如:
    def extract_nested_field(data, path):
        """从嵌套数据中提取目标字段"""
        result = []
        current_level = data
        for key in path[:-1]:
            if isinstance(current_level, list):
                current_level = [item.get(key, []) for item in current_level]
                current_level = [item for sublist in current_level for item in sublist]
            else:
                current_level = current_level.get(key, [])
        # 提取最后一层字段
        for item in current_level:
            result.append(item.get(path[-1], ""))
        return result
    
    # 调用示例:提取question字段
    questions = extract_nested_field(data["data"], ["paragraphs", "qas", "question"])
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:12:32