使用json.loads()报ValueError: Extra data错误,测试假数据却正常
嘿,我帮你梳理下这个问题——首先得提一句,你贴的这段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

