首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我对jsonpickle.decode和字典有问题

我对jsonpickle.decode和字典有问题
EN

Stack Overflow用户
提问于 2021-12-05 04:06:55
回答 1查看 382关注 0票数 2

我在使用Python3.9.9和json泡菜2.0.0将JSON解码为字典时遇到了问题。

JSON如下所示:

代码语言:javascript
复制
{
  "py/object" : "game.game.GameData",
  "origin" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : 67,
    "pos_y" : 44
  },
  "top_right" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : 1134,
    "pos_y" : -2
  },
  "bottom_right" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : 1125,
    "pos_y" : 623
  },
  "bottom_left" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : -2,
    "pos_y" : 604
  },
  "player_coordinates" : {
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/reduce\": [{\"py/type\": \"numpy.dtype\"}, {\"py/tuple\": [\"i4\", false, true]}, {\"py/tuple\": [3, \"<\", null, null, null, -1, -1, 0]}]}, {\"py/b64\": \"BAAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 4,
      "alpha" : 178,
      "pos_x" : 749,
      "pos_y" : 485
    },
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/id\": 7}, {\"py/b64\": \"AgAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 2,
      "alpha" : -4,
      "pos_x" : 290,
      "pos_y" : 421
    },
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/id\": 7}, {\"py/b64\": \"BQAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 5,
      "alpha" : 180,
      "pos_x" : 1048,
      "pos_y" : 304
    },
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/id\": 7}, {\"py/b64\": \"AQAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 1,
      "alpha" : 2,
      "pos_x" : 109,
      "pos_y" : 301
    },
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/id\": 7}, {\"py/b64\": \"AwAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 3,
      "alpha" : 0,
      "pos_x" : 296,
      "pos_y" : 165
    },
    "json://{\"py/reduce\": [{\"py/function\": \"numpy.core.multiarray.scalar\"}, {\"py/tuple\": [{\"py/id\": 7}, {\"py/b64\": \"BgAAAA==\"}]}]}" : {
      "py/object" : "player.coordinates.PlayerCoordinate",
      "player_id" : 6,
      "alpha" : -178,
      "pos_x" : 779,
      "pos_y" : 116
    }
  },
  "ball_coordinates" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : 617,
    "pos_y" : 344
  },
  "init_coordinates" : { },
  "goal_1" : {
    "py/object" : "game.goal.Goal",
    "post_1" : {
      "py/object" : "player.coordinates.BasicCoordinate",
      "pos_x" : 18,
      "pos_y" : 196
    },
    "post_2" : {
      "py/object" : "player.coordinates.BasicCoordinate",
      "pos_x" : 17,
      "pos_y" : 412
    }
  },
  "goal_2" : {
    "py/object" : "game.goal.Goal",
    "post_1" : {
      "py/object" : "player.coordinates.BasicCoordinate",
      "pos_x" : 1113,
      "pos_y" : 199
    },
    "post_2" : {
      "py/object" : "player.coordinates.BasicCoordinate",
      "pos_x" : 1111,
      "pos_y" : 423
    }
  },
  "game_status" : {
    "py/reduce" : [ {
      "py/type" : "game.game.GameStatus"
    }, {
      "py/tuple" : [ 1 ]
    } ]
  },
  "center" : {
    "py/object" : "player.coordinates.BasicCoordinate",
    "pos_x" : 562,
    "pos_y" : 311
  },
  "goals_team1" : 0,
  "goals_team2" : 0,
  "game_time" : 153.95,
  "should_log" : true
}

它使用这个命令jsonpickle.encode(data, keys=True)编码,其中data是一个dict()。在Windows机器上解码JSON是可行的,相同的Python和相同的json泡菜包。在Raspbian上,它不适用于相同的版本。

来自jsonpickle.decode的错误如下(但是,其他JSON数据可以使用相同的环境进行解码,调用时没有问题,但这些字典并不复杂):

代码语言:javascript
复制
   m = jsonpickle.decode(msg.payload, keys=True)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 50, in decode
    return context.restore(data, reset=reset, classes=classes)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 163, in restore
    value = self._restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 196, in _restore
    return restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 359, in _restore_object
    return self._restore_object_instance(obj, cls)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 421, in _restore_object_instance
    instance = self._restore_object_instance_variables(obj, instance)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 477, in _restore_object_instance_variables
    instance = self._restore_from_dict(obj, instance)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 446, in _restore_from_dict
    value = self._restore(v)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 196, in _restore
    return restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 570, in _restore_dict
    k = self._restore_pickled_key(k)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 613, in _restore_pickled_key
    key = decode(
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 50, in decode
    return context.restore(data, reset=reset, classes=classes)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 163, in restore
    value = self._restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 196, in _restore
    return restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 266, in _restore_reduce
    reduce_val = list(map(self._restore, obj[tags.REDUCE]))
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 196, in _restore
    return restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 537, in _restore_tuple
    return tuple([self._restore(v) for v in obj[tags.TUPLE]])
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 537, in <listcomp>
    return tuple([self._restore(v) for v in obj[tags.TUPLE]])
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 196, in _restore
    return restore(obj)
  File "/home/user/venv/lib/python3.9/site-packages/jsonpickle/unpickler.py", line 278, in _restore_reduce
    stage1 = f(*args)
TypeError: 'dict' object is not callable

不幸的是,我不知道在哪里发布这样的问题(json泡菜)到其他地方,这就是为什么我在这里尝试我的运气。在GitHub上,只有报告错误的可能性。

EN

回答 1

Stack Overflow用户

发布于 2022-09-09 17:35:43

我今天遇到了这个问题(Linux上的json泡菜2.2.0 ),并且能够追踪到它。导出的JSON中声明的每个py/object类型都必须是公共类型。在我的例子中,我有一个namedtuple,它位于一个类中,而不是模块的顶层。jsonpickle将对象类型记录为SystemStatus.MyTuple,一旦我将该MyTuple定义移至模块顶部,jsonpickle就能够通过将记录的参数传递给它来恢复该对象。

我的暗示是这个关于名称元组的仍然打开的错误让我开始四处张望。

(我知道OP在一条评论中指出,这个问题自己解决了,但差不多一年后,我遇到了同样的问题,这是谷歌最热门的问题之一,这就是我的答案。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70231396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档