在日常自動化測試中,json解析是經常要做的事情。但是有的json格式嵌套復雜,如果按照順序解析的方法,需要寫非常冗長的if判斷,有以下幾個缺點:1、無復用性:對于其他json格式或者當前格式稍微修改,就需要再寫一套;2、健壯性差:冗長的判斷極易寫錯。 下面是一個原始json串和經過json解析工具(http://app.baidu.com/app/enter?appid=159018)處理的json串: {"b":{"a":[{"n1":"WIFI","lo":116.30744414106923,"t2":"1387873418.195T+08:00","t3":"target_首頁-海報視頻點擊","p1":"com.tudou.ui.activity.HomeActivity","n2":840,"la":39.98049465154441,"l":false},{"n1":"WIFI","lo":116.30744414106923,"t2":"1387873415.880T+08:00","t1":"A1005","s1":"5da19f89080af666bc2cb8d8775706df","p1":"com.tudou.ui.activity.HomeActivity"}]},"h":{"i":{"o2":"4.3","o1":"Android","b2":"Nexus 7","m":"10:bf:48:c2:81:f5","h":1205,"w":800,"u":"f835c7f8-c331-4b47-a6a3-772021544aa9","b1":"google"}}} { "b":{ "a":[ { "n1":"WIFI", "lo":116.30744414106923, "t2":"1387873418.195T+08:00", "t3":"target_首頁-海報視頻點擊", "p1":"com.tudou.ui.activity.HomeActivity", "n2":840, "la":39.98049465154441, "l":false }, { "n1":"WIFI", "lo":116.30744414106923, "t2":"1387873415.880T+08:00", "t1":"A1005", "s1":"5da19f89080af666bc2cb8d8775706df", "p1":"com.tudou.ui.activity.HomeActivity" } ] }, "h":{ "i":{ "o2":"4.3", "o1":"Android", "b2":"Nexus 7", "m":"10:bf:48:c2:81:f5", "h":1205, "w":800, "u":"f835c7f8-c331-4b47-a6a3-772021544aa9", "b1":"google" } } } 仔細分析下json格式,無外乎就是字典套列表,列表套字典,層層嵌套,可以用遞歸實現。 def print_keyvalue_all(self,input_json): key_value='' if isinstance(input_json,dict): for key in input_json.keys(): key_value = input_json.get(key) if isinstance(key_value,dict): self.print_keyvalue_all(key_value) elif isinstance(key_value,list): for json_array in key_value: self.print_keyvalue_all(json_array) else: print str(key)+" = "+str(key_value) elif isinstance(input_json,list): for input_json_array in input_json: self.print_keyvalue_all(input_json_array) 需要注意的是isinstance內置函數的使用,判斷當前對象是列表還是字典,非常簡潔。 下面是輸出結果: u = f835c7f8-c331-4b47-a6a3-772021544aa9 w = 800 b2 = Nexus 7 h = 1205 m = 10:bf:48:c2:81:f5 o2 = 4.3 o1 = Android b1 = google p1 = com.tudou.ui.activity.HomeActivity lo = 116.307444141 n1 = WIFI n2 = 840 la = 39.9804946515 t2 = 1387873418.195T+08:00 t3 = target_首頁-海報視頻點擊 l = False p1 = com.tudou.ui.activity.HomeActivity lo = 116.307444141 s1 = 5da19f89080af666bc2cb8d8775706df t2 = 1387873415.880T+08:00 t1 = A1005 n1 = WIFI 下面是給定key,輸出value的遞歸實現。 def print_keyvalue_by_key(self,input_json,key): key_value='' if isinstance(input_json,dict): for json_result in input_json.values(): if key in input_json.keys(): key_value = input_json.get(key) else: self.print_keyvalue_by_key(json_result,key) elif isinstance(input_json,list): for json_array in input_json: self.print_keyvalue_by_key(json_array,key) if key_value!='': print str(key)+" = "+str(key_value) |
|
來自: qweertt4747 > 《待分類》