登录
首页 >  文章 >  python教程

Python处理嵌套JSON数据技巧

时间:2025-12-26 11:27:49 179浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《Python处理JSON嵌套数据方法详解》,以下内容主要包含等知识点,如果你正在学习或准备学习文章,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

推荐用 dict.get() 链式调用并设合理默认值(如{}或[])安全访问嵌套JSON;深度大时封装 safe_get 或用 jsonpath-ng 提取;结构化数据转 DataFrame 用 pd.json_normalize();统一清洗 None/""/"null" 等空值。

Python解析JSON接口数据_嵌套结构处理方法【指导】

遇到 KeyError 说明没处理好嵌套层级

JSON 数据里经常有 datalist[0]userprofile 这种多层嵌套,直接写 res['data']['list'][0]['user']['profile']['name'] 很容易在某一层为空或缺失字段时抛 KeyErrorTypeError

推荐用 dict.get() 链式调用,配合默认值兜底:

name = (
    res
    .get('data', {})
    .get('list', [{}])[0]
    .get('user', {})
    .get('profile', {})
    .get('name', '未知')
)
  • 每层都用 .get(key, default),避免崩;default 选空字典或空列表,方便后续继续链式调用
  • [0] 这种索引操作不能用 get,得先确保列表存在且非空——所以前面要用 .get('list', [{}]) 提供安全兜底
  • 如果结构深度大、访问频繁,建议封装成函数,比如 safe_get(res, 'data.list.0.user.profile.name', '未知')

用 jsonpath-ng 解析深层嵌套更灵活

当嵌套结构不固定(比如 items 下可能有 productservice 两种类型),或者要批量提取同名字段(如所有 id),硬写 .get() 会很累。

jsonpath-ng 是 Python 里最接近 JavaScript 的 lodash.get + jq 的组合:

from jsonpath_ng import parse
from jsonpath_ng.ext import parse as ext_parse
from jsonpath_ng.jsonpath import DatumInContext
<h1>安装:pip install jsonpath-ng</h1><p>json_data = {"results": [{"id": 1, "tags": ["a", "b"]}, {"id": 2, "tags": ["c"]}]}
jsonpath_expr = ext_parse('$.results[*].id')
matches = [match.value for match in jsonpath_expr.find(json_data)]</p><h1>→ [1, 2]</h1>
  • $.results[*].id 可以跳过中间层数,直接取所有 id[*] 自动处理列表,不用手动写 [0][1]
  • 支持过滤:$.results[?(@.tags.length > 1)] 找出 tags 长度大于 1 的项
  • 注意:原生 jsonpath-ng 不支持 ..(递归下降),要用 ext_parse;但也不支持 filter 里的复杂表达式,比如 @.x == @.y 会报错

把嵌套 JSON 扁平化成 pandas DataFrame

接口返回的是树状结构,但你真正要分析的是“每个用户对应几个订单”,这种一对多关系直接转 pd.DataFrame 会出错——pandas 会把整个子对象塞进一个单元格。

正确做法是先用 pd.json_normalize() 拆解:

import pandas as pd
<p>data = {
"users": [
{
"id": 1,
"name": "Alice",
"orders": [{"oid": "A001", "amount": 99}, {"oid": "A002", "amount": 150}]
},
{
"id": 2,
"name": "Bob",
"orders": [{"oid": "B001", "amount": 78}]
}
]
}</p><h1>展开 users,同时把 orders 拆成多行(record_path)</h1><p>df = pd.json_normalize(
data['users'],
record_path='orders',
meta=['id', 'name'],
errors='ignore'
)</p><h1>→ 三行:Alice 两条订单,Bob 一条</h1>
  • record_path 指定要“炸开”的嵌套列表字段;meta 指定要保留的父级字段
  • 如果 orders 缺失,加 errors='ignore' 防止中断;也可以用 meta_prefix 给父级字段加前缀避免重名
  • 不支持多层嵌套展开(比如 orders.items.discount),得先用 jsonpath-ng 或递归预处理

None 和空字符串混用导致数据清洗失败

很多接口对“无值”字段返回 null(Python 里是 None),但有些又返回空字符串 ""、空列表 [],甚至 "null" 字符串。不做统一清理,后续 str.upper()len() 就会报错。

  • 别用 if not x: 判断是否为空——它会把 0False 也当成空,而这些可能是合法值
  • 明确检查类型:x is Noneisinstance(x, str) and not x.strip()isinstance(x, list) and not x
  • 建议在解析后立刻做一次清洗,例如写个 clean_value(v) 函数,把 None"""null" 都转成统一的 None,再交给下游逻辑

嵌套深不可怕,可怕的是每一层都靠运气判断是否存在。真正省时间的做法,不是写更多 try/except,而是从第一行解析开始就建立“防御性访问”习惯——尤其是 .get() 的默认值选什么,决定了后面要不要写十行校验代码。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Python处理嵌套JSON数据技巧》文章吧,也可关注golang学习网公众号了解相关技术文章。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>