简体   繁体   中英

Is there a better way to parse a python dictionary?

I have a json dictionary and I need to check the values of the data and see if there is a match. I am using multiple if statements and the in operator like so:

"SomeData":
{
    "IsTrue": true,
    "ExtraData":
    {
      "MyID": "1223"
    }
}
json_data = MYAPI.get_json()
if 'SomeData' in json_data:
    some_data = json_data['SomeData']
    if 'IsTrue' in some_data:
        if some_data['IsTrue'] is True:
            if 'ExtraData' in some_data:
                if 'MyID' in some_data['ExtraData']:
                    if some_data['ExtraData']['MyID'] == "1234":
                        is_a_match = True
                        break

I know that in python3 the in operator should be used, but I am thinking there must be a better way than using multiple if statements like I am using. Is there a better way to parse json data like this?

Yes, you can assume that the keys are present, but catch a KeyError if they aren't.

try:
    some_data = json_data['SomeData']
    is_a_match = (
        some_data['IsTrue'] is True and
        some_data['ExtraData']['MyID'] == "1234"
        )
except KeyError:
    is_a_match = False

This style is called easier to ask for forgiveness than permission (EAFP) and it's used a lot in Python. The alternative is look before you leap (LBYL) , which you use in your solution.

I would suggest writing a path function to access values in your nested dictionary. Something along the lines of this (pseudocode):

def get_path_value(json_dict, path):
   """
    json_dict - dictionary with json keys and values
    path - list of key sequences, e.g. ['SomeData', 'IsTrue']
       you can make this a helper function and use an entry point that
       splits paths, e.g. "SomeData/IsTrue"
   """

   if len(path) == 1:
      # last tag, base case
      return json_dict[path[0]]
   else: 
      return get_path_value(json_dict[path[0]], path[1:])

Add try/catch if you want something other than bad key, but this will let you navigat the dictionary a little more eloquently. Then you have things like:

if get_path_value(json_dict, ["SomeData", "IsTrue"]) == True and ...

You could even write a nice little class to wrap this all up, eg json["SomeData/IsTrue"] == True

Best of luck, Marie

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