You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从嵌套JSON中按key的id获取value的name(无索引无循环)

问题描述

有一份嵌套JSON数据,需要根据输入的key字典中的id值,获取对应value字典里的name值。限制条件:

  • 不同URL中数据位置会变化,不能使用索引定位
  • 数据量较大,需要不使用显式for循环的一行代码解决方案
原始代码(存在缺陷)
import requests, re, json

r = requests.get('https://www.trendyol.com/apple/macbook-air-13-m1-8gb-256gb-ssd-altin-p-67940132').text

json_data1 = json.loads(re.search(r"window.__PRODUCT_DETAIL_APP_INITIAL_STATE__=({.*}});window", r).group(1))

print(json_data1)

# 缺陷:依赖索引[0]定位,数据位置变化时会失效
print('json_data1:',json_data1['product']['attributes'][0]['value']['name'])
解决方案代码

利用next()结合生成器表达式实现一行代码查找,无需显式for循环,也不依赖索引:

import requests, re, json

r = requests.get('https://www.trendyol.com/apple/macbook-air-13-m1-8gb-256gb-ssd-altin-p-67940132').text

json_data1 = json.loads(re.search(r"window.__PRODUCT_DETAIL_APP_INITIAL_STATE__=({.*}});window", r).group(1))

# 目标id
target_id = 168
# 一行代码获取对应value的name,找不到时返回默认值None(可按需修改)
result = next((attr['value']['name'] for attr in json_data1['product']['attributes'] if attr['key']['id'] == target_id), None)

print('result:', result)
代码说明
  • next()会迭代生成器表达式,返回第一个符合条件的元素后立即停止,效率适配大数据量场景
  • 生成器表达式内部遍历attributes列表,筛选出key['id']匹配目标值的元素,提取其value['name']
  • 第二个参数None为无匹配时的默认返回值,可改为空字符串等其他值
输入输出示例

输入 >> id: 168
输出 >> name: Apple M1

扩展封装

如果需要多次查询不同id,可封装为函数复用:

def get_value_name_by_key_id(data, target_id):
    return next((attr['value']['name'] for attr in data['product']['attributes'] if attr['key']['id'] == target_id), None)

# 调用示例
print(get_value_name_by_key_id(json_data1, 249))  # 输出: 256 GB

内容的提问来源于stack exchange,提问作者piseynir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:55:23