为何使用Python3无法正确提取嵌套JSON中的final_balance值
报错原因定位
- 结构层级认知偏差:解析后拿到的最外层字典,键是比特币地址字符串
1DyRGJQZZMr9LxRFXHq5AZ4gopqk7pCPZi,final_balance是这个键对应的内层嵌套字典的字段,并不是最外层字典的直接属性,直接写obj['final_balance']必然触发KeyError - 类型误用:Python3中字典的
.values()方法返回dict_values类型的可迭代对象,并非支持下标索引的字典/列表结构,对其直接用['final_balance']取值,就会触发“不可下标访问”的类型错误 - 类型不匹配:
final_balance返回的是整数类型数值,直接和字符串'$ '做加法拼接,也会触发类型不兼容的报错
修正后可正常运行的代码
import json import urllib.request # 下载原始JSON对象 url = "http://blockchain.info/balance?active=1DyRGJQZZMr9LxRFXHq5AZ4gopqk7pCPZi" data = urllib.request.urlopen(url).read().decode() # 解析JSON对象 obj = json.loads(data) # 逐层定位字段:最外层用地址字符串作为键取内层字典,再读取final_balance target_address = "1DyRGJQZZMr9LxRFXHq5AZ4gopqk7pCPZi" final_balance = obj[target_address]["final_balance"] # 接口返回的余额单位为聪(比特币最小单位),除以1e8即可转换为常规BTC单位 print(f'$ {final_balance / 100000000}')
如果不想硬编码地址字符串,也可以直接取出最外层字典的唯一内层值,适配接口“传入单个地址就返回单个键值对”的固定结构:
# 无硬编码的取值方式 inner_detail = next(iter(obj.values())) final_balance = inner_detail["final_balance"]
补充说明
- 原始
final_balance的数值772038对应772038聪,按单位换算后约为0.00772038 BTC,可根据展示需求决定是否做单位转换 - 拼接输出时优先使用f-string格式化,避免直接做字符串和数值的加法操作触发类型错误
内容的提问来源于stack exchange,提问作者joe5
相关产品推荐
相关产品推荐

