Python JSON解码得到错误的值

时间:2015-12-04 01:57:02

标签: python json

我设置了一个具有特定解码器功能的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本身。

任何人都可以解释一下吗?

1 个答案:

答案 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]}}}