如何从 JSON 数据中安全提取嵌套在列表中的 value 字段

本文详解 python 中访问 json 嵌套结构(尤其是列表内对象字段)的正确方法,重点解决因误将列表当字典索引导致的 typeerror,并提供健壮、可复用的提取逻辑。

本文详解 python 中访问 json 嵌套结构(尤其是列表内对象字段)的正确方法,重点解决因误将列表当字典索引导致的 typeerror,并提供健壮、可复用的提取逻辑。

在处理 Mojang 会话服务器返回的玩家资料 JSON(如 https://sessionserver.mojang.com/session/minecraft/profile/{id}?unsigned=false)时,开发者常需提取 properties 数组中 name: "textures" 对应的 value 字段(即 Base64 编码的皮肤纹理数据)。但直接使用 skin_data["properties"]["value"] 会触发 TypeError: list indices must be integers or slices, not str —— 根本原因在于:properties 是一个列表(list),而非字典(dict),无法用字符串键索引。

正确的做法是先确认该列表存在且非空,再遍历其中每个属性对象,按条件匹配目标项并安全提取字段。以下是推荐的生产级实现:

FlowMuse AI

节点式AI视觉创作引擎

下载

import requests
import json

skin_url = f"https://sessionserver.mojang.com/session/minecraft/profile/{data['id']}?unsigned=false"
try:
    skin_r = requests.get(skin_url, timeout=5)
    skin_r.raise_for_status()  # 检查 HTTP 错误状态码
    skin_data = skin_r.json()  # 推荐用 .json() 替代 json.loads(skin_r.text)

    # 安全获取 textures 的 value
    textures_value = None
    for prop in skin_data.get("properties", []):
        if isinstance(prop, dict) and prop.get("name") == "textures":
            textures_value = prop.get("value")
            break  # 找到即退出,避免冗余遍历

    if textures_value:
        print("Textures value (Base64):", textures_value[:64] + "..." if len(textures_value) > 64 else textures_value)
    else:
        print("Warning: 'textures' property not found or missing 'value' field.")

except requests.exceptions.RequestException as e:
    print(f"Network error fetching profile: {e}")
except json.JSONDecodeError as e:
    print(f"Invalid JSON response: {e}")
except KeyError as e:
    print(f"Missing expected field in JSON: {e}")

关键要点与最佳实践:

  • 使用 skin_data.get("properties", []) 替代直接索引,避免 KeyError;
  • 显式检查 isinstance(prop, dict) 防御性编程,确保列表元素为字典;
  • 用 .get("name") 和 .get("value") 安全取值,避免 KeyError;
  • 添加 timeout 和 raise_for_status() 提升网络请求鲁棒性;
  • 优先调用 response.json() 而非 json.loads(response.text),它自动处理编码与异常;
  • 若需支持多属性或动态名称,可封装为可复用函数:
def get_property_value(data, target_name, field="value"):
    """从 properties 列表中查找指定 name 的对象,并返回其指定字段值"""
    for prop in data.get("properties", []):
        if isinstance(prop, dict) and prop.get("name") == target_name:
            return prop.get(field)
    return None

# 使用示例
value = get_property_value(skin_data, "textures", "value")

掌握这种“列表→对象→字段”的三级安全访问模式,不仅能解决 Mojang API 场景,也适用于任何含数组嵌套结构的 JSON 解析任务。

相关推荐:

迷你世界开发者怎么提取收益

1、首先打开迷你盒子,再点击开发者中心;2、就会弹出下面这个图,再点击我的钱包;3、最后就可以看到收益,点击提现就可以提取收益了。要绑定银行卡才能提现,迷你豆不需要,只不过必须要买300m豆才能提现。 详细答案: 1、首先打开迷你盒子,再点击开发者中心。 2、就会弹出下面这个图,再点击我的钱包。 3、最后就可以看到收益,点击提现就可以提取收益了。要绑定银行卡才能提现,迷你豆不需要,只不过必须要买3...

迷你世界保险箱怎么提取

在游戏主界面点击开始游戏,然后选择需要提档的那个游戏进度(非创造模式);进入游戏后按B键打开背包,然后点击右下角“仓库”;在仓库中找到保险箱并双击,然后点击“提取”,这样保险箱就会被提到存档使用了。 详细答案: 在游戏主界面点击开始游戏,然后选择需要提档的那个游戏进度(非创造模式)。 进入游戏后按B键打开背包,然后点击右下角“仓库”。 在仓库中找到保险箱并双击,然后点击“提取”,这样保险箱就会被提...

宙斯浏览器如何提取当前网页内所有的图片素材?

最有效方法是用开发者工具控制台执行脚本提取全部图片URL:涵盖img标签、CSS背景图、Base64内联图和懒加载图片,去重后直接复制下载,无需插件且兼容禁用扩展的办公环境。 你需要从宙斯浏览器打开的网页中一次性拿到所有图片,包括普通标签、CSS背景图、Base64内联图和懒加载图片,而不是一张张右键另存为。 用开发者工具控制台执行脚本提取全部图片URL 这是最轻量、无需安装扩展、且能覆盖绝大多数...

如何解决Safari浏览器中iframe嵌套外部页面的Cookie跨域限制?

Safari中iframe嵌入外部页面时Cookie失效是因第三方Cookie拦截,需通过用户显式跳转使目标域名变第一方;方案包括前端引导页跳转、服务端302重定向或iframe自刷新、Nginx反向代理同域映射。 当你的网站在Safari中通过iframe嵌入外部页面(如合作方系统、第三方应用)时,该页面无法设置或读取Cookie,导致登录态丢失、会话中断、跳转失败——这不是代码bug,而是Sa...

Excel怎么快速提取括号内文字 提取单元格部分内容公式

Excel中提取括号内容有五种方法:1.用MID+SEARCH提取首个括号内文字;2.用FILTERXML(Win10+)提取全部括号内容并垂直/横向输出;3.用TEXTBEFORE+TEXTAFTER(365/2021)简化公式;4.用Power Query处理大批量混乱数据;5.所有方法均需注意括号匹配与版本兼容性。 当你在Excel里处理客户备注、产品规格或日志信息时,常会遇到“型号A(黑色...

PDF24提取页面功能在哪 PDF24文件处理操作方法【技巧】

PDF24的“提取页面”功能可免费快速提取指定页码生成新PDF,支持桌面版与网页版,提供缩略图预览和逗号分隔的页码输入(如3,7,12),操作简单无需注册。 想从几十页的PDF里快速挑出第3、第7、第12页单独保存成新文件,又不想装一堆软件或注册账号,PDF24的“提取页面”功能就是最直接的解法——它不锁免费页数、支持逗号分隔的不连续页码输入、桌面版和网页版都自带缩略图预览,操作完立刻生成独立PD...

IF函数多层嵌套怎么写 Excel逻辑判断公式编写技巧

必须用IF多层嵌套实现区间分流,核心是逐级排除、自然收敛;推荐从高到低写法,如=IF(A1>=95,"卓越",IF(A1>=85,"优秀",IF(A1>=70,"良好","需改进")))。 在Excel中根据数值区间自动返回对应等级或提成比例,必须用IF函数多层嵌套来实现精确分流,否则单层IF只能处理“是/否”二选一,无法覆盖多个分段阈值。 先搞懂嵌套的核心逻辑 IF函数每次只做...

Excel身份证号怎么提取年龄 自动计算周岁函数使用教程

Excel中提取身份证年龄需先用MID(A2,7,8)提取18位证号的出生日期,再用DATE函数转为标准日期,最后用DATEDIF(C2,TODAY(),"y")计算周岁;15位证号须补全为18位或单独处理。 Excel中身份证号提取年龄需先定位出生日期字段,再用DATEDIF函数计算周岁,避免直接用YEAR(TODAY())-YEAR()导致虚岁误差。 从18位身份证号中提取出生日期 选中存放身...