在Python中解析JSON以获取跟踪响应时获取KeyError

时间:2017-02-04 07:39:35

标签: python json list parsing dictionary

TL; DR: 在这种情况下,混淆了如何解析以下JSON响应并获得[有效负载的dynamicValue_GGG的状态12345]。

完整的问题: 我通过以下Python代码点击REST API获得以下(清理)响应:

  

response = requests.request(“POST”,url,data = payload,   标题=报头)以.json()

{
    "payload": {
        "name": "asdasdasdasd",
        "dynamicValue_GGG": {
            "12345": {
                "model": "asad",
                "status": "active",
                "subModel1": {
                    "dynamicValue_67890": {
                        "model": "qwerty",
                        "status": "active"
                    },
                "subModel2": {
                    "dynamicValue_33445": {
                        "model": "gghjjj",
                        "status": "active"
                    },
                "subModel3": {
                    "dynamicValue_66778": {
                        "model": "tyutyu",
                        "status": "active"
                    }                   
                }
            }
        },
        "date": "2016-02-04"
    },
    "design": "asdasdWWWsaasdasQ"
}

如果我执行type(response['payload']),它会给我'dict'。

现在,我正在尝试解析上面的响应并从中获取某些键和值。问题是我无法迭代使用“索引”而是必须指定“密钥”,但是响应具有动态生成和发送的某些“密钥”。例如,与“dynamicValue_GGG”键不同,名为“dynamicValue_66778”,“status”等的键不是静态的。

我可以通过提及如下来成功解析:

print response['payload']['dynamicValue_GGG']['12345'][status]

在这种情况下,我得到预期的输出='active'。

但是,由于我无法控制“dynamicValue_GGG”,因此只有在我可以指定类似的内容时才会有效:

print response['payload'][0][0][status]

但上面的行给出了错误:“KeyError: 0”执行python代码时。

在这种情况下,我是否可以使用两个键的功能以及索引?

1 个答案:

答案 0 :(得分:2)

Python中字典中值的顺序是随机的,因此您无法使用索引。你将不得不遍历所有元素,可能是递归的,并测试它是否是你正在寻找的东西。例如:

def find_submodels(your_dict):
  for item_key, item_values in your_dict.items():
    if 'status' in item_values:
      print item_key, item_values['status']

    if type(item_values) == dict:
      find_submodels(item_values)

find_submodels(your_dict)

哪个会输出:

12345 active
dynamicValue_67890 active
dynamicValue_66778 active
dynamicValue_33445 active