使用json.loads解析两个独立JSON字符串时遇"Extra Data"错误求助
问题分析与解决方案
错误原因
json.decoder.JSONDecodeError: Extra data 是因为 json.loads() 只能解析单个独立的JSON对象/数组,如果传入的字符串包含多个JSON结构(比如两个用换行分隔的JSON,或是旧数据与新数据的拼接),就会触发该错误。结合你的代码,问题出在三个地方:
- 变量拼接错误:你使用
jsonAgain += ...累加响应内容,如果jsonAgain未初始化为空字符串(或是之前有残留值),新接收的JSON会和旧内容拼接成包含多个JSON的字符串,导致解析失败。 - TCP流式传输特性:TCP是流式协议,
s.recv(8012)可能一次性返回多个响应,或是返回不完整的响应内容,直接解析会出现格式问题。 - 代码笔误:
print(idVar)和print(marksVar)中,变量名与你定义的ageVar、colorVar不匹配,会触发额外的NameError。
修复后的代码
import json import socket # 假设你已经建立好socket连接 s buffer = "" # 用缓冲区统一管理流式数据 # 第一次请求与响应处理 firstDict = {"age": "20"} firstJson = json.dumps(firstDict) + '\n' s.sendall(bytes(firstJson, encoding="utf-8")) buffer += s.recv(8012).decode() # 按约定的换行符拆分,逐个解析完整的JSON结构 while '\n' in buffer: json_str, buffer = buffer.split('\n', 1) json_str = json_str.strip() if json_str: # 跳过空行 pyData = json.loads(json_str) ageVar = pyData["age"] print(ageVar) # 第二次请求与响应处理 secDict = {"color": "red"} secJson = json.dumps(secDict) + '\n' s.sendall(bytes(secJson, encoding="utf-8")) buffer += s.recv(8012).decode() while '\n' in buffer: json_str, buffer = buffer.split('\n', 1) json_str = json_str.strip() if json_str: pyAgain = json.loads(json_str) colorVar = pyAgain["color"] print(colorVar)
关键修复点
- 用缓冲区管理流式数据:通过缓冲区累加接收的内容,再按你约定的分隔符(
\n)拆分出完整的JSON字符串,确保每次只解析单个合法的JSON结构,适配TCP流式传输的特性。 - 取消无意义的变量累加:不再使用
+=直接拼接新响应到旧变量,而是统一用缓冲区处理,避免残留数据导致的多JSON问题。 - 修正变量名笔误:将打印语句中的变量名改为实际定义的变量,避免额外报错。
内容的提问来源于stack exchange,提问作者Alexa Halpert
相关产品推荐
相关产品推荐

