Django从嵌套JSON数据中取值问题(Open FDA API场景)
在Django中处理Open FDA API的嵌套JSON数据
嘿,我完全懂你处理Open FDA API嵌套JSON时的取值烦恼——这种层级结构的数据刚开始确实容易踩坑,我来给你一步步拆解怎么在Django里轻松搞定它!
场景1:直接处理API返回的JSON响应
如果你是直接从Open FDA API请求数据,拿到响应后先转成Python字典,然后就可以通过键嵌套访问来获取数据了。这里推荐用get()方法代替直接用[]取值,能避免键不存在时抛出KeyError,更安全。
举个实际代码例子:
import requests from django.shortcuts import render def fetch_fda_report(request): # 替换成你的Open FDA API请求地址 api_endpoint = "https://api.fda.gov/drug/event.json?limit=1" response = requests.get(api_endpoint) if response.status_code == 200: # 把JSON响应转成Python字典 fda_report = response.json()["results"][0] # 假设取第一个结果 # 获取顶层字段 seriousness_other = fda_report.get("seriousnessother") receipt_date = fda_report.get("receiptdate") # 获取嵌套在reportduplicate里的字段 # 方式1:先判断父级键是否存在 duplicate_info = fda_report.get("reportduplicate") if duplicate_info: duplicate_num = duplicate_info.get("duplicatenumb") duplicate_source = duplicate_info.get("duplicatesource") # 方式2:链式get(),更简洁,即使父级键不存在也不会报错 duplicate_num_alt = fda_report.get("reportduplicate", {}).get("duplicatenumb") # 把数据传给模板或者后续逻辑 context = { "seriousness_other": seriousness_other, "duplicate_num": duplicate_num, "duplicate_source": duplicate_source } return render(request, "fda_report.html", context) else: # 处理API请求失败的情况 return render(request, "error.html", {"message": "Failed to fetch FDA data"})
场景2:从Django模型的JSONField中读取数据
如果你把API返回的JSON存在了Django模型的JSONField里,取值逻辑和处理普通字典几乎一致:
首先定义模型:
from django.db import models class FDAReport(models.Model): report_data = models.JSONField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f"FDA Report {self.id}"
然后从模型实例中读取嵌套数据:
# 获取一个已存储的报告实例 report = FDAReport.objects.first() # 顶层字段取值 safety_version = report.report_data.get("safetyreportversion") # 嵌套字段取值 duplicate_source = report.report_data.get("reportduplicate", {}).get("duplicatesource")
在Django模板中展示嵌套JSON数据
如果要在模板里渲染这些数据,直接用点语法就可以访问字典的键,模板会自动处理层级:
<div class="fda-report"> <p>Receipt Date: {{ report.report_data.receiptdate }}</p> <p>Safety Report Version: {{ report.report_data.safetyreportversion }}</p> {% if report.report_data.reportduplicate %} <div class="duplicate-info"> <h4>Duplicate Details</h4> <p>Duplicate Number: {{ report.report_data.reportduplicate.duplicatenumb }}</p> <p>Source: {{ report.report_data.reportduplicate.duplicatesource }}</p> </div> {% endif %} </div>
用{% if %}判断嵌套键是否存在,能避免页面显示空内容,体验更友好。
关键注意点
- 始终优先用
.get(key, 默认值)来取值,而不是直接dict[key],这样能避免因API返回数据缺失导致的报错; - 处理嵌套数据时,要么先检查父级键是否存在,要么用链式
.get()(比如dict.get("parent_key", {}).get("child_key")),确保代码健壮性; - 如果Open FDA API返回的结构有变动,记得在代码里做容错处理,比如给
get()设置合理的默认值。
内容的提问来源于stack exchange,提问作者Sapna Sharma
相关产品推荐
相关产品推荐

