分享

Python实现递归解析json

 qweertt4747 2018-06-12

        在日常自动化测试中,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)


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多