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

使用json.loads()报ValueError: Extra data错误,测试假数据却正常

解析JSON字符串报错但假数据正常?排查思路来啦

嘿,我帮你梳理下这个问题——首先得提一句,你贴的这段dummy_test本身就有JSON语法错误,这可能是你测试时没留意的细节,先帮你修正,再分析真实数据报错的核心原因:

先修正你的测试代码

你的dummy_test里,"reported"字段的值写错了:原本应该是一个对象,结果写成了"reported": "hum":33.1(多了个引号,结构错误),而且末尾还多了一个闭合大括号。修正后的正确代码:

import json

dummy_test = """{"state":{"reported": {"hum":33.1,"temp":22.3,"relay":false,"pir":10964},"desired":{"hum":33.1,"temp":22.3,"pir":10964}}}"""

def sensor_update(client, userdata, message):
    print("++++++++update++++++++++")
    print("###" + dummy_test + "###")
    print(type(dummy_test))
    sensor_bath = json.loads(dummy_test)
    print(sensor_bath)

真实数据报错但测试数据正常的可能原因

如果修正后的测试代码能正常运行,但真实的message.payload解析报错,大概率是真实数据本身的问题,你可以按以下方向排查:

  • 真实数据存在JSON语法问题:比如引号不匹配、逗号遗漏、括号不闭合(就像你最初的测试数据那样)。你可以把真实数据复制出来,用Python自带的json.tool工具校验:

    echo '你的真实JSON字符串' | python -m json.tool
    

    如果有语法错误,工具会直接指出位置。

  • 编码不兼容:json.loads()默认只支持UTF-8编码的字符串/字节,如果真实数据是GBK、GB2312等其他编码,就会触发解析错误。你可以尝试指定编码解码:

    # 假设真实数据是GBK编码,先解码再解析
    raw_data = message.payload.decode('gbk')
    sensor_bath = json.loads(raw_data)
    
  • 隐藏不可见字符:真实数据里可能混入了换行符、制表符、零宽空格等控制字符,这些字符肉眼很难发现,但会破坏JSON结构。你可以先清洗数据:

    import re
    # 移除所有控制字符
    cleaned_data = re.sub(r'[\x00-\x1f\x7f-\x9f]', '', message.payload.decode())
    sensor_bath = json.loads(cleaned_data)
    
  • 特殊字符未转义:真实数据中的字符串可能包含未转义的双引号、反斜杠(比如"content": "He said "hello""),这种情况在测试数据里没出现,但真实数据里存在就会直接报错。

  • 消息被截断:从你的函数看这是MQTT回调,可能网络问题导致消息 payload 不完整,拿到的是半截JSON。你可以在回调里先打印真实数据的长度和完整内容,确认是否是完整的JSON字符串:

    def sensor_update(client, userdata, message):
        print("真实数据长度:", len(message.payload))
        print("真实数据内容:", message.payload)
        # 捕获错误并打印细节
        try:
            sensor_bath = json.loads(message.payload)
        except json.JSONDecodeError as e:
            print("解析错误位置:", e.pos)
            print("错误原因:", e.msg)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:16:06