我设置了一个具有特定解码器功能的JSON解码器:
data.tankDecoder = JSONDecoder(object_hook=tankFromJSON)
tankFromJSON:
def tankFromJSON(obj):
print("object", obj)
humans = [HumanFish(human["name"], human["position"][0],
human["position"][1], human["size"])
for human in obj["humans"]]
bots = [RobotFish(bot["position"][0], bot["position"][1], bot["size"])
for bot in obj["bots"]]
tank = Tank(obj["canvasSize"], humans)
tank.grass = obj["grass"]
tank.bots = bots
print(tank)
return tank
我得到的JSON看起来像这样:
{
"canvasSize": 600,
"newBotOffset": 50,
"grass": [
[583, 588],
...,
[409, 575],
[496, 574]
],
"bots": [],
"humans": [{
"name": ["127.0.0.1", 50014],
"acceleration": [0, 0],
"maxSpeed": 3,
"speed": [0, 0],
"accelerationRate": 1,
"position": [300.0, 300.0],
"foodHistory": [],
"efficiency": 0.4,
"size": 20,
"color": "green"
}],
"maxBots": 20
}
由于某种原因,obj
函数中tankFromJSON
的值成为humans
列表中的第一个字典,而不是整个JSON本身。
任何人都可以解释一下吗?
答案 0 :(得分:4)
在解码期间,对于遇到的每个JSON对象,都会调用一次对象钩子。你看到的是首先在内部对象上调用钩子,然后在反序列化展开时调用外部对象。
换句话说,整个JSON对象被处理,但它包含的任何对象首先以内向外的方式处理,如下例所示:
s = '''
{
"outer": {
"middle": {
"inner": [1, 2, 3]
}
}
}
'''
def hook(obj):
print(obj)
return obj
decoder = JSONDecoder(object_hook=hook)
decoder.decode(s)
以上版画:
{'inner': [1, 2, 3]}
{'middle': {'inner': [1, 2, 3]}}
{'outer': {'middle': {'inner': [1, 2, 3]}}}