如何用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
相关产品推荐
相关产品推荐

