Python多列表JSON处理异常:嵌套列表加载时报JSONDecodeError
嘿,我来帮你搞定这个JSON解码错误!首先,咱们先拆解一下问题:你说单列表序列化反序列化没问题,但嵌套列表就报JSONDecodeError: Expecting value: line 1 column 1 (char 0),这个错误的核心是传给json.loads()的字符串是空的,或者开头不是有效的JSON格式。
先给你看个正常运行的例子,你的代码逻辑本身是没问题的:
import json data = [["a","b","c"],["1","2","3"]] data2 = str.encode(json.dumps(data)) st = bytes.decode(data2) msg = json.loads(st) print(msg) # 输出: [['a', 'b', 'c'], ['1', '2', '3']]
那问题大概率出在实际场景的细节里,给你几个排查和解决的方向:
1. 先确认st的实际内容
在调用json.loads(st)之前,赶紧打印一下st的值:
print("st的内容:", repr(st))
- 如果输出是
''(空字符串):那说明data2是空字节串,往前查json.dumps(data)为什么返回空——大概率是你的data生成有问题(比如从数据库追加列表时出错,导致data是空或者无效)。 - 如果输出是类似
"b'[["a","b","c"],["1","2","3"]]'":这说明你错误地把字节串的repr结果当成了要解码的内容(比如保存data2时用了repr(data2)而不是直接存字节),这种情况下直接用data2给json.loads()就行(Python3.6+支持直接加载字节串)。
2. 检查data的结构和元素类型
JSON只能序列化特定类型:字符串、数字、列表、字典、布尔值、None。如果你的嵌套列表里藏了非JSON支持的类型(比如数据库返回的datetime对象、bytes字节串、自定义类实例),json.dumps()虽然可能不会直接报错,但生成的字符串可能异常,或者在某些情况下导致后续解码失败。
比如如果data里有bytes元素:
data = [["a", b"b"], ["1","2"]] # 这时候json.dumps(data)会直接抛出TypeError,因为bytes不能被序列化
你可以先遍历data检查所有元素类型,确保都是JSON友好的。
3. 简化你的序列化反序列化流程
其实你完全可以省去手动encode和decode的步骤,因为:
- Python3.6+的
json.loads()直接支持传入字节串,所以可以直接写:
data2 = json.dumps(data).encode() msg = json.loads(data2)
- 如果你只是要深拷贝这个列表,甚至不需要JSON转一圈,直接用
copy.deepcopy(data)更高效。
4. 排查Python版本差异
如果你用的是Python2,注意str和unicode的区别:json.dumps(data)返回的是str类型(字节串),不需要再调用str.encode(),否则会导致双重编码,解码后得到的字符串可能包含额外的转义,最终引发解码错误。Python2下直接这么写就行:
import json data = [["a","b","c"],["1","2","3"]] st = json.dumps(data) msg = json.loads(st)
按照这些步骤排查,应该能快速定位问题所在!
内容的提问来源于stack exchange,提问作者PyCobra
相关产品推荐
相关产品推荐

