使用具有不同值的多个相同字符串解析 Python JSON
Parsing Python JSON with multiple same strings with different values
我遇到了一个问题,我试图解析 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
如果一次只有 1 个 id 字符串,这会起作用,但总是有多个,并且位置会不时更改。
那么 return 如何从这个 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
更新:
多亏了 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 侦听器。
你最好的选择是联系 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])
我遇到了一个问题,我试图解析 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
如果一次只有 1 个 id 字符串,这会起作用,但总是有多个,并且位置会不时更改。
那么 return 如何从这个 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
更新: 多亏了 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 侦听器。
你最好的选择是联系 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])