背景:
在跟其他產品對接過程中,對方傳過來的數據是JSON、字典、列表無限循環嵌套的格式。通過key一步一步取到對應值非常繁瑣,於是想到寫個取值的方法實現。當然,首先是去搜索了一番......果不其然,有個兄弟已經寫了一個非常貼近我需求的方法,感謝這位兄弟。原文鏈接為:https://www.cnblogs.com/Detector/p/8085460.html
但他的方法只能實現字典、列表、元組循環嵌套的格式中取值,而我的實際情況是JSON中還循環嵌套了JSON,於是在他的基礎做了一些修改實現了我想要的結果。
參考代碼:
1 #!/usr/bin/python 2 #coding:utf-8 3 4 import json 5 6 def isjson(myjson): 7 """判斷是否為json對象""" 8 try: 9 json_object = json.loads(myjson) 10 except Exception as e: 11 return False 12 return True 13 14 15 def get_target_value(key, dic, tmp_list): 16 """ 17 :param key: 目標key值 18 :param dic: JSON數據 19 :param tmp_list: 用於存儲獲取的數據 20 :return: list 21 """ 22 if not isinstance(dic, dict) or not isinstance(tmp_list, list): # 對傳入數據進行格式校驗 23 return 'argv[1] not an dict or argv[-1] not an list ' 24 25 if key in dic.keys(): 26 tmp_list.append(dic[key]) # 傳入數據存在則存入tmp_list 27 else: 28 for value in dic.values(): # 傳入數據不符合則對其value值進行遍歷 29 if isinstance(value, dict): 30 get_target_value(key, value, tmp_list) # 傳入數據的value值是字典,則直接調用自身 31 elif isinstance(value, (list, tuple)): 32 _get_value(key, value, tmp_list) # 傳入數據的value值是列表或者元組,則調用_get_value 33 elif isjson(value): 34 value1 = json.loads(value) 35 get_target_value(key, value1, tmp_list) #傳入數據的value值是json字符串,則裝載成python對象,並調用自身 36 return tmp_list 37 38 39 def _get_value(key, val, tmp_list): 40 for val_ in val: 41 if isinstance(val_, dict): 42 get_target_value(key, val_, tmp_list) # 傳入數據的value值是字典,則調用get_target_value 43 elif isinstance(val_, (list, tuple)): 44 _get_value(key, val_, tmp_list) # 傳入數據的value值是列表或者元組,則調用自身 45 elif isjson(val_): 46 value2 = json.loads(val_) 47 get_target_value(key, value2, tmp_list) #傳入數據的value值是json字符串,則裝載成python對象,並調用get_target_value