jsonpickle.decode解码字典在Raspbian系统报TypeError错误咨询
jsonpickle跨Raspbian/Windows解码报错解决方案
- 方案1:序列化前预处理所有字典键,统一转换为Python原生类型
遍历字典结构,将所有numpy类型(np.int*/np.float*等)的键通过.item()方法转换为Python原生int/float,自定义类实例作为键的场景提前转换为唯一字符串标识,从根源避免非原生类型的跨平台序列化兼容问题。
预处理示例代码:import numpy as np def preprocess_dict(data): new_data = {} for k, v in data.items(): if isinstance(k, np.generic): k = k.item() if isinstance(v, dict): v = preprocess_dict(v) new_data[k] = v return new_data processed_data = preprocess_dict(original_data) - 方案2:编码时新增
make_refs=False参数
复杂结构包含嵌套对象、循环引用时,jsonpickle默认生成的对象引用ID在不同架构下不通用,禁用引用生成可避免引用解析错误,编码写法调整为jsonpickle.encode(processed_data, keys=True, make_refs=False)。 - 方案3:解码时显式传入依赖的类列表
提前导入所有自定义类、用到的numpy类型,解码时通过classes参数传入,避免jsonpickle动态加载类时出现路径匹配失败,解码写法示例:# 提前导入所有依赖的自定义类、numpy类型 from your_module import CustomClassA, CustomClassB import numpy as np decoded_data = jsonpickle.decode( json_str, keys=True, classes=[CustomClassA, CustomClassB, np.int32, np.int64, np.float32, np.float64] ) - 方案4:升级jsonpickle到2.2.0及以上版本
jsonpickle 2.0.0存在ARM架构下numpy类型键的序列化兼容bug,2.2.0版本已修复该问题,可直接通过pip install -U jsonpickle==2.2.0升级,无需修改原有编码解码逻辑。
报错根因:
- x86架构Windows和ARM架构Raspbian下numpy基础数值类型的序列化类引用标记存在差异,
keys=True参数序列化非字符串键时,跨平台解析会出现类加载失败,误将类型描述字典当成构造函数调用,触发'dict' object is not callable报错。- 复杂结构的对象引用ID在不同架构下生成规则不一致,jsonpickle 2.0.0版本解析错误时会将普通字典对象误识别为可调用对象。
内容的提问来源于stack exchange,提问作者Joysn
相关产品推荐
相关产品推荐

