我已经创建了一个等于t.json的变量。JSON文件如下:
{
"groups": {
"customerduy": {
"nonprod": {
"name": "customerduynonprod",
"id": "529646781943",
"owner": "cloudops@coerce.com",
"manager_email": ""
},
"prod": {
"name": "phishing_duyaccountprod",
"id": "241683454720",
"owner": "cloudops@coerce.com",
"manager_email": ""
}
},
"customerduyprod": {
"nonprod": {
"name": "phishing_duyaccountnonprod",
"id": "638968214142",
"owner": "cloudops@coerce.com",
"manager_email": ""
}
},
"ciasuppliergenius": {
"prod": {
"name": "ciasuppliergeniusprod",
"id": "220753788760",
"owner": "cia_developers@coerce.com",
"manager_email": "jarks@coerce.com"
}
}
}
}我的目标是解析这个JSON文件并为"owner“获取值,并将其输出到一个新var。例子如下:
t.json = group_map
group_id_aws = group(
group.upper(),
"accounts",
template,
owner = group_map['groups']['prod'],
manager_description = "Groups for teams to access their product accounts.", 我一直遇到的错误是:KeyError: 'prod'
发布于 2022-03-24 21:54:28
您会得到一个关键错误,因为键“prod”不在“分组”中,您拥有的是
group_map['groups']['customerduy']['prod']
group_map['groups']['ciasuppliergenius']['prod']因此,您必须从树中的每个元素中提取“所有者”:
def s(d,t):
for k,v in d.items():
if t == k:
yield v
try:
for i in s(v,t):
yield i
except:
pass
print(','.join(s(j,'owner')))发布于 2022-03-24 23:05:45
所有者发生4次,所以这里是如何获得所有的。
import json
# read the json
with open("C:\\test\\test.json") as f:
data = json.load(f)
# get all 4 occurances
owner_1 = data['groups']['customerduy']['nonprod']['owner']
owner_2 = data['groups']['customerduy']['prod']['owner']
owner_3 = data['groups']['customerduyprod']['nonprod']['owner']
owner_4 = data['groups']['ciasuppliergenius']['prod']['owner']
# print results
print(owner_1)
print(owner_2)
print(owner_3)
print(owner_4)结果:
cloudops@coerce.com
cloudops@coerce.com
cloudops@coerce.com
cia_developers@coerce.com发布于 2022-03-25 11:32:06
如果您的JSON加载在变量data中,则可以使用递归函数来处理JSON文件中可能出现的两个容器类型(dict和list):
def find_all_values_for_key(d, key, result):
if isinstance(d, dict):
if key in d:
result.append(d[key])
return
for k, v in d.items():
find_all_values_for_key(v, key, result)
elif isinstance(d, list):
for elem in d:
find_all_values_for_key(elem, key, result)
owners = []
find_all_values_for_key(data, 'owner', owners)
print(f'{owners=}')这意味着:
owners=['cloudops@coerce.com', 'cloudops@coerce.com', 'cloudops@coerce.com', 'cia_developers@coerce.com']这样,您就不必费心使用中间键的名称,或者一般情况下JSON文件的结构。
在您的示例中没有任何列表,但是使用可能“潜伏”在list元素下的某个地方的owner键将它们递归到任何dict中是很简单的,所以最好是处理将来可能对JSON的更改。
https://stackoverflow.com/questions/71609538
复制相似问题