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

如何用Python和Pandas在Flask API中访问嵌套JSON指定数据?

解决Flask API中嵌套JSON数据的访问问题

错误原因

你遇到的KeyError: 'chapter',是因为pd.read_json读取嵌套JSON后,df['chapters']列存储的是列表对象(每个元素是包含章节信息的字典),而不是直接的键值对结构。直接用df['chapters']['chapter']去访问,本质是在列表里找名为'chapter'的键,自然会报错。

解决方案一:直接操作JSON字典(推荐)

对于这种多层嵌套的JSON结构,直接用Python内置的json模块读取并遍历,比用Pandas更简单高效:

import json
from flask import Flask

app = Flask(__name__)

@app.route("/api/v1/<book>/<chapter>/<verse>/")
def api(book, chapter, verse):
    book = book.replace(" ", "").title()
    
    # 读取JSON文件为字典
    with open(f"Python/{book}.json", 'r', encoding='utf-8') as f:
        book_data = json.load(f)
    
    target_text = None
    # 遍历章节列表,找到匹配的章节
    for chap in book_data['chapters']:
        if chap['chapter'] == chapter:
            # 遍历当前章节的经节列表,找到匹配的经节
            for v in chap['verses']:
                if v['verse'] == verse:
                    target_text = v['text']
                    break
            break
    
    # 构造返回结果,未找到则提示
    result_dictionary = {
        'Book': book,
        'Chapter': chapter,
        'Verse': verse,
        'Text': target_text if target_text else '未找到对应内容'
    }
    return result_dictionary

解决方案二:用Pandas的json_normalize扁平化数据

如果一定要用Pandas处理,可以用json_normalize将嵌套的列表结构展开成扁平的DataFrame,再进行筛选:

import pandas as pd
from flask import Flask

app = Flask(__name__)

@app.route("/api/v1/<book>/<chapter>/<verse>/")
def api(book, chapter, verse):
    book = book.replace(" ", "").title()
    
    # 读取JSON为Series对象(避免自动生成DataFrame导致的层级问题)
    book_data = pd.read_json(f"Python/{book}.json", typ='series')
    
    # 展开chapters和verses的嵌套结构
    df = pd.json_normalize(
        book_data['chapters'],
        record_path='verses',  # 展开verses列表
        meta=['chapter']       # 保留chapter字段作为元数据
    )
    # 添加book字段
    df['book'] = book_data['book']
    
    # 筛选匹配的章节和经节
    filt = (df['chapter'] == chapter) & (df['verse'] == verse)
    matched_row = df.loc[filt]
    
    # 获取目标文本,未找到则提示
    target_text = matched_row['text'].iloc[0] if not matched_row.empty else '未找到对应内容'
    
    result_dictionary = {
        'Book': book,
        'Chapter': chapter,
        'Verse': verse,
        'Text': target_text
    }
    return result_dictionary

总结

对于这种嵌套层级明确、仅需按条件查找单条数据的场景,直接操作JSON字典的方案更简洁高效,不需要引入Pandas的额外复杂度。如果后续需要对数据进行批量分析或处理,再考虑使用json_normalize扁平化数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:01:56