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

使用具有不同值的多个相同字符串解析Python JSON,python,json,parsing,dictionary,key-value,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时遇到了KeyEr

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

{
"apps": [{
    "id": "app1",
    "id": "app2",
    "id": "new-app"
}]
}
因此,到目前为止,我所做的是将json响应转换为字典,以便我实际解析“id”的第一次迭代。我曾尝试创建for循环,但在尝试查找字符串id或TypeError时遇到了KeyError:列表索引必须是整数或切片,而不是str。我唯一能够成功完成的事情是定义要输出的id位置

(data['apps'][N]['id']) -> where N = 0, 1 or 2
如果一次只能有一个id字符串,但总是有多个,并且位置会不时更改,那么这将起作用

那么,如何从这个json输出返回“id”的所有字符串的值呢?完整代码如下:

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
更新: 多亏了罗布,我才得以下定决心ᵩ. 以下是我最终使用的:

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。它应该是我想要达到的目标的视觉表现。我实际上正在使用。尝试为端口映射容器构建python侦听器。

最好的选择是联系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])

非常感谢@Robᵩ . 你用钩子功能引导我走向正确的方向。不需要具有范围的for循环。再次感谢。多次出现身份证?这是有效的JSON吗?(Java脚本对象表示法)。一个JavaScript对象不能有两个同名属性,我想说,同一个字典中不能有两个相同的键。我认为你把问题暴露错了。您可能希望将其更改为
{“apps”:[{“id”:“app1”},{“id”:“app2”},{“id”:“new app”}]}
。这也是我从您的
for n in data
循环中了解到的-根据我对两者的阅读,您可能希望
打印(数据['apps'][n]['id'])
,这是有效的JSON。至少根据文字,如果不是精神,如果是标准。API虽然在技术上没有破坏,但毫无用处。您无法从Python的JSON解析器访问各种
id
字段。我怀疑您也无法从任何其他语言的解析器访问它们。你能向API的作者投诉吗?好的,如果你将一个特殊的钩子函数传递到
data.json()
,有一种方法。我将创建一个示例。