访问JSON对象中的嵌套键

时间:2019-06-20 07:55:38

标签: python json

我想在Python中访问特定的键值(“ cote_1989_base”)以对其进行修改。但是我有一个TypeError:字符串索引必须是整数。

我的代码:

import json

with open('demo_db_algolia_2019.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())
    for x in data:
        cote1989base = x.get(["cote"][0]["cote_1989"]["cote_1989_eu"]["cote_1989_base"])
        print(cote1989base)

编辑:也许我没有很好地解释这一点,因为我的整个JSON都在这样的数组中:

    [{
    "objectID": 10035,
    "cote":
    {
        "cote_1989":
        {
            "cote_1989_f": "750000F",
            "cote_1989_eu":
            {                    
                "cote_1989_base": 190140                    
            }
        },
        "cote_2004":
        {                
            "cote_2004_base": 173320                
        },
        "cote_2014":
        {                
            "cote_2014_base": 420800                
        },
        "cote_2017":
        {                
            "cote_2017_base": 939600                
        },
        "cote_2019":
        {                
            "cote_2019_base": 939600                
        }
    }
},
    {
    "objectID": 10202,
    "cote":
    {
        "cote_1989":
        {
            "cote_1989_f": "27000F",
            "cote_1989_eu":
            {                    
                "cote_1989_base": 6844                    
            }
        },
        "cote_2004":
        {
            "cote_2004_base": 10894                
        },
        "cote_2014":
        {
            "cote_2014_base": 23670
        },
        "cote_2017":
        {                
            "cote_2017_base": 46980
        },
        "cote_2019":
        {                
            "cote_2019_base": 51156
        }
    }
}
]

它是否改变了主要问题?

3 个答案:

答案 0 :(得分:2)

您应按以下方式访问密钥:

x.get("cote").get("cote_1989").get("cote_1989_eu").get("cote_1989_base")

或者您可以使用以下函数来简化代码:

def find(data, key):
    parts = key.split('/')
    dd = data
    for part in parts:
         if ( dd == None or not isinstance(dd,dict)):
            return None
         dd = dd.get(part)         
    return dd    

>>> data = { 'a' : { 'b' : { 'c' : { 'd':5} , 'c1':8 } }}
>>> find(data, 'a/b/c/d'))
5
>>> find(data, 'a/b/c2')
8
>>> find(data, 'z/b')
None

答案 1 :(得分:0)

此位:x.get(["cote"][0]["cote_1989"]当然是错误的。这里的方括号不是dict查找,而是列表文字,因此["cote"][0]的值为"cote"

然后,用["cote_1989"]下标,TypeError就是下标。

您应该链接.get()个呼叫:

x.get("cote").get("cote_1989").get("cote_1989_eu").get("cote_1989_base")

假设原始JSON正确,那么在原始代码中将[0]位视为“行噪声”。

答案 2 :(得分:0)

JSON中存在错误。花括号不匹配。使用这个。

import json


j = '''
{
    "objectID": 10035,
    "cote": {
        "cote_1989": {
            "cote_1989_f": "750000F",
            "cote_1989_eu": {
                "cote_1989_excp": 266196,
                "cote_1989_concours": 228168,
                "cote_1989_base": 190140,
                "cote_1989_be": 152112,
                "cote_1989_me": 114084,
                "cote_1989_ar": 76056,
                "cote_1989_epa": 38028
            }
        },
        "cote_2004": {
            "cote_2004_excp": 242648,
            "cote_2004_concours": 207984,
            "cote_2004_base": 173320,
            "cote_2004_be": 138656,
            "cote_2004_me": 103992,
            "cote_2004_ar": 69328,
            "cote_2004_epa": 34664
        }
    }
}'''

data = json.loads(j)
print(data['cote']['cote_1989']['cote_1989_eu']['cote_1989_base'])

输出:

190140