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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:24:02