首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中通过这个json解析问题

在python中通过这个json解析问题
EN

Stack Overflow用户
提问于 2022-03-24 21:18:43
回答 3查看 34关注 0票数 0

我已经创建了一个等于t.json的变量。JSON文件如下:

代码语言:javascript
复制
{
    "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。例子如下:

代码语言:javascript
复制
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'

EN

回答 3

Stack Overflow用户

发布于 2022-03-24 21:54:28

您会得到一个关键错误,因为键“prod”不在“分组”中,您拥有的是

代码语言:javascript
复制
group_map['groups']['customerduy']['prod']
group_map['groups']['ciasuppliergenius']['prod']

因此,您必须从树中的每个元素中提取“所有者”:

代码语言:javascript
复制
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')))
票数 0
EN

Stack Overflow用户

发布于 2022-03-24 23:05:45

所有者发生4次,所以这里是如何获得所有的。

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
cloudops@coerce.com
cloudops@coerce.com
cloudops@coerce.com
cia_developers@coerce.com
票数 0
EN

Stack Overflow用户

发布于 2022-03-25 11:32:06

如果您的JSON加载在变量data中,则可以使用递归函数来处理JSON文件中可能出现的两个容器类型(dict和list):

代码语言:javascript
复制
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=}')

这意味着:

代码语言:javascript
复制
owners=['cloudops@coerce.com', 'cloudops@coerce.com', 'cloudops@coerce.com', 'cia_developers@coerce.com']

这样,您就不必费心使用中间键的名称,或者一般情况下JSON文件的结构。

在您的示例中没有任何列表,但是使用可能“潜伏”在list元素下的某个地方的owner键将它们递归到任何dict中是很简单的,所以最好是处理将来可能对JSON的更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71609538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档