简体   繁体   中英

How do I get a value from a json array using a key

I'm reading a json and want to get the label field with a specific id. What I currently have is:

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"])

My json has data blocks (being "interface" or "settings") and those data blocks contain arrays.

{
    "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":[
    
    ]
}

You can "find" the element in the interface list via a list-comprehension, and fetch the label from that element. For instance:

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

If you cannot assume that the relevant id exists, then you can wrap this in a try-except, or you can get a list of the labels and validate that it isn't of length 0, or whatever you think would work best for you.

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

And while you're at it, you might want to explicitly deal with there being multiple elements with the same id, etc.


Clarification regarding your error(s): parsed_dict["interface"] is a list, so you can index it with int s (and slices and stuff, but that's besides the point), and not with str ings.
Each of the list elements is a dict , with two key s: id and label , so even if you were to take a specific element, say -

el = parsed_dict["interface"][0]

you still couldn't do el['testkey'] , because that's a value of the dict, not a key .

You could check if the id is the one you're looking for though, via -

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

In fact, the single line I gave above is really just shorthand for running over all the elements with a loop and doing just that...

You need to browse through all the values and check if it matches expected value. Because values are not guaranteed to be unique in a dictionary, you can't simply refer to them directly like you do with keys.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM