Python提取JSON指定字段与嵌套数据的方法

陆景行
陆景行
发布时间:2026-10-12 | 1人浏览过
原创

在Python开发中常需从接口响应中提取指定字段。本文演示如何通过标准库解析字符串与字典型JSON,并提供自定义递归路径查找函数,用于快速定位嵌套结构中的目标数据,适用于接口调试、字段校验及数据过滤等常见业务场景。

Python 解析与提取 JSON 数据的常用方法

第1步:处理字符串格式的 JSON 数据

外部接口返回的数据通常以纯文本字符串形式传输。使用内置 json 模块可将其安全反序列化为 Python 字典。需注意,json.loads() 严格遵循 JSON 规范,要求源字符串必须使用双引号包裹键名与字符串值。原稿中采用 .replace("'", '"') 的替换方案在处理包含转义字符或嵌套单引号的业务数据时极易报错,生产环境请直接传入符合标准的 JSON 字符串。

import json

# 模拟标准 JSON 响应字符串
json_str = '{"err_no": 0, "err_str": "OK", "pic_id": "1169213517976400008", "pic_str": "xoet", "md5": "ca9bc4fda521498d2b3aba5dbb4ee4ac"}'

# 将字符串反序列化为字典对象
data = json.loads(json_str)
print(data["pic_str"])  # 输出: xoet

第2步:直接获取字典格式的目标字段

若数据已在内存中呈现为 Python 字典(例如通过 ast.literal_eval 或上游服务转换),可直接通过键名索引或 .get() 方法提取。使用 .get() 可在键不存在时返回默认值,避免抛出 KeyError 中断流程。

import json

# 内存中的字典对象
data = {'err_no': 0, 'err_str': 'OK', 'pic_id': '1169213517976400008', 'pic_str': 'xoet', 'md5': 'ca9bc4fda521498d2b3aba5dbb4ee4ac'}

# 推荐:安全获取指定字段
target_value = data.get('pic_str')
print(target_value)

# 备选:遍历匹配目标键
for key, value in data.items():
    if key == 'pic_str':
        print(f"找到目标字段: {value}")
        break

第3步:通过路径递归提取嵌套数据

企业级接口返回值往往包含多层对象与列表交织的结构。手动逐层写 data['key']['list'][0]['field'] 可读性差且易越界。以下封装了一个基于深度优先搜索(DFS)的递归函数,支持传入路径列表自动展开嵌套结构。当遇到列表时,函数会拆分遍历并将所有匹配目标键的值收集至结果集中。

def extract_element_from_json(obj, path):
    '''
    根据 path 路径递归提取 obj 中的数据。
    返回值为包含匹配结果的列表;若路径断层或缺失则补入 None。
    '''
    def _dfs(current, path_idx, acc):
        key = path[path_idx]
        next_idx = path_idx + 1

        if next_idx < len(path):
            if isinstance(current, dict) and key in current:
                _dfs(current[key], next_idx, acc)
            elif isinstance(current, list):
                for item in current:
                    _dfs(item, next_idx, acc)
            else:
                acc.append(None)
                
        if next_idx == len(path):
            if isinstance(current, list):
                for item in current:
                    acc.append(item.get(key, None))
            elif isinstance(current, dict):
                acc.append(current.get(key, None))
            else:
                acc.append(None)
        return acc

    if isinstance(obj, dict):
        return _dfs(obj, 0, [])
    elif isinstance(obj, list):
        return [_dfs(item, 0, []) for item in obj]

# 示例:从嵌套 JSON 中连续提取 familyMembers 下的 name
api_response = {
  "familyName": "thinker family",
  "familyMembers": [
    {"name": "Jobs", "powers": ["Radiation resistance"]},
    {"name": "James", "powers": ["Million tonne punch"]}
  ]
}

result = extract_element_from_json(api_response, ["familyMembers", "name"])
print(result)  # 输出: ['Jobs', 'James']

第4步:配置接口校验与数据传递逻辑

结合上述提取逻辑,可将目标字段映射至自动化测试框架或数据管道中。在实际部署时,建议为提取函数添加 try-except 容错块,配合日志记录捕获结构变更导致的解析失败。对于高频调用的 HTTP 接口,可使用 requests 快速获取响应体:

import requests

resp = requests.get("https://ip-api.com/json")
data = resp.json()
# 校验接口状态码是否成功返回
status_list = extract_element_from_json(data, ["status"])
print(status_list)

总结

针对 JSON 数据提取任务,基础扁平结构推荐使用 json.loads() 配合字典键索引;面对多层嵌套与异构列表,自定义递归路径函数能显著降低硬编码耦合度并提升批量字段抽取效率。以上就是 Python 提取 JSON 指定内容与嵌套数据的核心方法与代码实践,更多关于接口数据清洗与自动化校验的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表