Python解析API返回JSON字典检测None值报TypeError问题求助
错误根因
- 你的校验逻辑仅判断了响应文本是否为空,完全没覆盖解析后字典的异常场景:当接口返回的
my_dict['elements']为None、或者elements是空列表时,直接用下标[0]取值就会触发你遇到的NoneType不可取下标的报错 lag变量定义在while循环内部,每次循环都会被重置为0.5,你写的延迟递增逻辑完全不生效- 没有校验HTTP请求是否成功,接口返回4xx/5xx错误时,响应内容不是合法JSON,解析后会得到异常结构
- 手动拼接URL并替换空格的方式容易出现编码错误,requests库原生支持自动处理参数转义
修复方案
调整代码逻辑,增加多层安全校验,修改后完整代码如下:
import json import time import requests from requests.structures import CaseInsensitiveDict import pygame def show_qr(): # 改用requests params参数自动处理转义,不用手动替换空格 url = "https://api.mercadopago.com/merchant_orders" headers = CaseInsensitiveDict() headers["Authorization"] = "Bearer MY_TOKEN" params = {"external_reference": reference} pygame.init() ventana = pygame.display.set_mode(window_resolution,pygame.FULLSCREEN) producto = pygame.image.load("qrcode001.png") producto = pygame.transform.scale(producto, [640,480]) trials = 0 status = "undefined" lag = 0.5 # 把lag移到循环外,递增逻辑才会生效 while status != "closed" and trials < 10: ventana.blit(producto, (448,192)) pygame.display.update() try: # 发送请求,自动校验HTTP状态码 response = requests.get(url, headers=headers, params=params) response.raise_for_status() my_dict = response.json() # 多层安全校验再取值 if my_dict.get('elements') and len(my_dict['elements']) > 0: status = my_dict['elements'][0].get('status', 'undefined') else: # elements为空或者不存在,增加延迟 lag += 0.5 except Exception as e: # 捕获所有请求、解析异常,避免程序直接崩溃 print(f"请求异常: {str(e)}") lag += 0.5 time.sleep(lag) trials += 1 time.sleep(5) print(trials)
修改说明
- 改用
requests.get的params参数传递查询条件,自动处理编码转义,不需要手动替换空格 - 增加
try-except块捕获请求、JSON解析、HTTP错误等所有异常,避免程序直接退出 - 取值前先判断
elements字段存在且长度大于0,再取下标0的元素,避免None/空列表下标报错 - 用
dict.get()方法取字段值,避免字段不存在时报错 - 将
lag变量移到循环外部,延迟递增逻辑正常生效
内容的提问来源于stack exchange,提问作者Lisandro R
相关产品推荐
相关产品推荐

