如何用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
相关产品推荐
相关产品推荐

