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

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升级,无需修改原有编码解码逻辑。

报错根因:

  1. x86架构Windows和ARM架构Raspbian下numpy基础数值类型的序列化类引用标记存在差异,keys=True参数序列化非字符串键时,跨平台解析会出现类加载失败,误将类型描述字典当成构造函数调用,触发'dict' object is not callable报错。
  2. 复杂结构的对象引用ID在不同架构下生成规则不一致,jsonpickle 2.0.0版本解析错误时会将普通字典对象误识别为可调用对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:15:00