python 如何从JSON字典列表中获取多个键值对

pinkon5k  于 2023-02-02  发布在  Python
关注(0)|答案(2)|浏览(246)

我有一个名为“hostnames”的JSON文件,格式如下

{
    'propertyName': 'www.property1.com',
    'propertyVersion': 1,
    'etag': 'jbcas6764023nklf78354',
    'rules': {
        'name': 'default',
        'children': [{
            'name': 'Route',
            'children': [],
            'behaviors': [{
                'name': 'origin',
                'options': {
                    'originType': 'CUSTOMER',
                    'hostname': 'www.origin1.com',

我想获取键“propertyName”和“hostname”的值,并创建一个如下所示的新JSON文件

'properties': [{
    'propertyName': 'www.property1.com',
    'hostnames': ['www.origin1.com', 'www.origin2.com']
}, {
    'propertyName': 'www.property1.com',
    'hostnames': ['www.origin1.com', 'www.origin2.com']
}]

我的代码如下所示

hostnames = result.json()
hostnameslist = [host['hostname'] for host in hostnames['rules']['children']['behaviors']['options']]
print(hostnameslist)

但我得到了错误

TypeError: list indices must be integers or slices, not str
anauzrmj

anauzrmj1#

您正在尝试访问具有字符串索引('behaviors ')的列表元素。请尝试:

hostnames = result.json()
hostnameslist = []
for child in hostnames['rules']['children']:
    for behavior in child['behaviors']:
        if behavior['name'] == 'origin':
            hostnameslist.append(behavior['options']['hostname'])

properties = [{
    'propertyName': hostnames['propertyName'],
    'hostnames': hostnameslist
}]
yfjy0ee7

yfjy0ee72#

假设OP的数据可能是如何结构化的。
递归导航字典以查找与字典键"hostname"关联的所有/任何值似乎非常适合这里。
这样做就不需要了解字典的深度,甚至不需要了解字典中除"hostname"(显然)之外的任何键名。
当然,在"master"字典中可能有其他字典包含"hostname"键,如果是这种情况,那么这个函数可能返回不需要的值。

data = {
    'propertyName': 'www.property1.com',
    'propertyVersion': 1,
    'etag': 'jbcas6764023nklf78354',
    'rules': {
        'name': 'default',
        'children': [{
            'name': 'Route',
            'children': [],
            'behaviors': [{
                'name': 'origin',
                'options': {
                    'originType': 'CUSTOMER',
                    'hostname': 'www.origin1.com'
                }
            },
            {
                'name': 'origin',
                'options': {
                    'originType': 'CUSTOMER',
                    'hostname': 'www.origin2.com'
                }
            }
            ]
        }
        ]
    }
}

def get_hostnames(d):
    def _get_hostnames(_d, _l):
        if isinstance(_d, dict):
            if 'hostname' in _d:
                _l.append(_d['hostname'])
            else:
                for _v in _d.values():
                    _get_hostnames(_v, _l)
        else:
            if isinstance(_d, list):
                for _v in _d:
                    _get_hostnames(_v, _l)
        return _l
    return _get_hostnames(d, [])

result = {'properties': [{'propertyName': data.get('propertyName'), 'hostnames': get_hostnames(data)}]}

print(result)
    • 输出:**
{'properties': [{'propertyName': 'www.property1.com', 'hostnames': ['www.origin1.com', 'www.origin2.com']}]}

相关问题