Python实现递归解析json
来源:互联网 发布:安卓6.0 移动数据开关 编辑:程序博客网 时间:2024/04/27 09:18
在日常自动化测试中,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-772021544aa9w = 800b2 = Nexus 7h = 1205m = 10:bf:48:c2:81:f5o2 = 4.3o1 = Androidb1 = googlep1 = com.tudou.ui.activity.HomeActivitylo = 116.307444141n1 = WIFIn2 = 840la = 39.9804946515t2 = 1387873418.195T+08:00t3 = target_首页-海报视频点击l = Falsep1 = com.tudou.ui.activity.HomeActivitylo = 116.307444141s1 = 5da19f89080af666bc2cb8d8775706dft2 = 1387873415.880T+08:00t1 = A1005n1 = 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
- Python实现递归解析json
- python 递归解析json
- JSON解析-python实现
- Python递归实现汉诺塔详细解析
- gson递归解析json数据
- python-Json模块【解析Json】
- python-Json模块【解析Json】
- python-Json模块【解析Json】
- python-Json模块【解析Json】
- python解析json:json模块
- python解析json
- 【python】解析json
- python解析json基础
- python微信四json解析
- python解析json
- python解析json
- Python解析Json
- python解析json文件
- linux shell
- ios动画
- 职场新人如何招架同事倚老卖老?
- 地址空间的归纳总结
- 读书笔记
- Python实现递归解析json
- c++ stl algorithm: std::find, std::find_if
- nginx+keepalived负载均衡可用框架(一 keepalived双机系统)
- [Linux] 文件系统和df,du命令
- Spark实现的hello world<转>
- Application详解
- 伪类元素:before 和 :after
- ArcGIS10.1制图综合新工具
- jquery自定义表单填写组件