使用具有不同值的多个相同字符串解析Python JSON

时间:2016-03-18 14:04:54

标签: python json parsing dictionary key-value

我遇到了一个问题,我试图解析JSON中存在超过1次的id字符串。我正在使用请求库从API中提取json。我正在尝试检索" id"的所有值。但只能成功地拉出我定义的那个。示例json:

{
"apps": [{
    "id": "app1",
    "id": "app2",
    "id": "new-app"
}]
}

所以我到目前为止所做的是将json响应转换为字典,以便我实际解析" id"的第一次迭代。我试图创建for循环,但在尝试查找字符串id或TypeError时已经获得KeyError:list indices必须是整数或切片,而不是str。我能够成功做的唯一事情是定义要输出的id位置。

(data['apps'][N]['id']) -> where N = 0, 1 or 2

如果一次只有1个id的字符串,但总是多个,并且位置会不时变化,这将有效。

那么如何为" id"返回所有字符串的值?从这个单一的json输出?完整代码如下:

import requests
url = "http://x.x.x.x:8080/v2/apps/"
response = requests.get(url)

#Error if not 200 and exit
ifresponse.status_code!=200:
print("Status:", response.status_code, "CheckURL.Exiting")
exit()

#Turn response into a dict and parse for ids 
data = response.json()
for n in data:
    print(data['apps'][0]['id'])

OUTPUT:
app1

更新: Robᵩ能够得到解决方案。以下是我最终使用的内容:

def list_hook(pairs):
result = {}
for name, value in pairs:
    if name == 'id':
        result.setdefault(name, []).append(value)
    print(value)

data = response.json(object_pairs_hook = list_hook)

此外,我发布的API不是真正的API。它应该是我想要实现的视觉表现。我实际上正在使用 Mesosphere's Marathon API 。试图为端口映射容器构建一个python监听器。

1 个答案:

答案 0 :(得分:1)

您最好的选择是联系API的作者,让他知道他的数据格式是愚蠢的。

您的下一个最佳选择是通过传入钩子函数来修改JSON解析器的行为。这样的事情应该有效:

def list_hook(pairs):
    result = {}
    for name, value in pairs:
        if name == 'id':
            result.setdefault(name, []).append(value)
        else:
            result[name] = value
    return result

data = response.json(object_pairs_hook = list_hook)

for i in range(3):
    print(i, data['apps'][0]['id'][i])