如何使用键从json数组中获取值

3phpmpom  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(193)

我正在阅读一个json,并希望获得具有特定id的标签字段。

with open("local_en.json") as json_file:
    parsed_dict = json.load(json_file)
    print(parsed_dict)                         # works
    print(parsed_dict["interface"])            # works
    print(parsed_dict["interface"]["testkey"])

我的json有数据块(“接口”或“设置”),这些数据块包含数组。

{
    "interface":[
    {"id": "testkey", "label": "The interface block local worked!"}
    {"id": "testkey2", "label": "The interface block local worked, AGAIN!"}
    ],
    "settings":[
    
    ],
    "popup_success":[
        
    ],
    "popup_error":[
    
    ],
    "popup_warning":[
    
    ],
    "other_strings":[
    
    ]
}
mcdcgff0

mcdcgff01#

你需要浏览所有的值,并检查它是否与期望值匹配。因为值在字典中不保证是唯一的,你不能像处理键那样简单地直接引用它们。

print([el for el in d["interface"] if "testkey" in el.values()])
wswtfjt7

wswtfjt72#

你可以通过列表解析在interface列表中“找到”元素,并从该元素中获取标签。例如:

label = [x['label'] for x in parsed_dict['interface'] if x['id'] == 'testkey'][0]

如果不能假设相关的id存在,那么可以将其 Package 在try-except中,或者可以获取标签列表并验证其长度不为0,或者您认为最适合您的任何方法。

key = 'testkey'
labels = [x['label'] for x in parsed_dict['interface'] if x['id'] == key]
assert len(labels) > 0, f"There's no matching element for key {key}"
label = labels[0]  # Takes the first if there are multiple such elements in the interface array

当你这样做的时候,你可能想显式地处理多个元素具有相同的id,等等。
关于您的错误的说明:parsed_dict["interface"]是一个列表,所以你可以用int s(以及切片和其他东西,但这不是重点)来索引它,而 * 而不是 * 用str ings。
每个列表元素都是一个dict,其中包含两个keyidlabel,所以即使你取一个特定的元素,比如-

el = parsed_dict["interface"][0]

您 * 仍然 * 不能执行el['testkey'],因为这是dict的value,而不是key
你 * 可以 * 检查id是否是你要找的,通过-

if el['id'] == 'testkey':
    print('Yup, this is it')
    label = el['label']

实际上,我上面给出的一行代码实际上只是用循环遍历所有元素的简写...

相关问题