介绍
这篇文章主要为大家逐层解析Python3自定义json,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。
用Python3对json内容逐层进行解析,拿中国天气网的接口返回数据测试,
代码如下:
# - * -编码:utf - 8 - * 进口经营者作为op 从进口defaultdict集合 类Json(对象): def __init__(自我,json: str): 某事=eval (json) 使:…负荷=λ如果op.eq(类型(某事)。__name__ dict.__name__)还没有 自我。json_dict=加载(某事) 自我。ret_j=defaultdict(东西) self.analyze (self.json_dict) def分析(自我,j_dict: dict级=0)→没有: 级+=1 在j_dict k: v=j_dict [k] v_type=类型(v) 试一试: self.ret_j(级)(str (j_dict)] .append (f" {k}: {v}“) 除了: self.ret_j(级)[str (j_dict)]=[] self.ret_j(级)(str (j_dict)] .append (f" {k}: {v}“) 如果op.eq (v_type。__name__ dict.__name__): 自我。分析(v级) elif op.eq (v_type。__name__ list.__name__): 为每个v: 如果op.eq(类型(每个)。__name__ dict.__name__): 自我。分析(每级) def get_analysis(自我)→没有: 打印(f"这个json拢共分{len (self.ret_j)}层“) 打印(“- - - - - -“) 在self.ret_j级: 打印(f"第{}级层解析“) 在self.ret_j根(级): 打印(f"解析内容:{根}“) 对于每个在self.ret_j(级)(根): 打印(每个) 打印(“- - - - - -“) if __name__==& # 39; __main__ # 39;: 试一试: 进口的要求 除了: 退出(0) url=癶ttp://forecast.weather.com.cn/napi/h6map/city/101/jQuery1533133004035& # 63;调=jQuery1533133004035" r=requests.get (url) d_r=r.content.decode () json_4_test=d_r [d_r.index (“(”) + 1: d_r.index (“)“)) Json (json_4_test) .get_analysis ()
其中json_4_test是待解析的Json字符串。
设计思路:
补充知识:python之记录模块:将不同的日志写入到不同的文件
如下所示:
进口logging.config 从日志导入LogRecord #通常用于Linux系统下,使控制台输出的日志带颜色 类ColorFormatter (logging.Formatter): log_colors={ & # 39;关键# 39;033年:& # 39;\[0,猴31 # 39; & # 39;错误# 39;033年:& # 39;\[0,猴33 # 39; & # 39;预警# 39;033年:& # 39;\[0,猴35 # 39; & # 39;信息# 39;033年:& # 39;\[0,猴32 # 39; & # 39;调试# 39;033年:& # 39;\[0,猴00 # 39; } def格式(自我,记录:LogRecord)→str: s=super () .format(记录) level_name=record.levelname 如果level_name self.log_colors: 回归自我。log_colors [level_name] + s + & # 39; 033年\[0猴# 39; 返回年代 类MyFilter400 (logging.Filter): def过滤器(自我,记录:LogRecord): 如果record.msg.startswith (“4“): 还真 返回假 类MyFilter300 (logging.Filter): def过滤器(自我,记录:LogRecord): 如果record.msg.startswith (“3”): 还真 返回假 LOG_LEVEL=logging.INFO 记录器={ & # 39;版本# 39;:1, & # 39;disable_existing_loggers& # 39;:没错, & # 39;格式器# 39;:{ & # 39;颜色# 39;:{ & # 39;类# 39;:& # 39;__main__.ColorFormatter& # 39; #如果你的模块不是写在启动程序中,请将__main__更换成你模块的路径,下同 & # 39;格式# 39;:& # 39;% (asctime) s[%(名字)s] % (levelname): %(消息)& # 39; }, & # 39;默认# 39;:{ & # 39;类# 39;:& # 39;logging.Formatter& # 39; & # 39;格式# 39;:& # 39;%(消息)& # 39; } }, & # 39;过滤器# 39;:{ & # 39;filter_400& # 39;: { & # 39;()& # 39;:& # 39;__main__.MyFilter400& # 39; }, & # 39;filter_300& # 39;: { & # 39;()& # 39;:& # 39;__main__.MyFilter300& # 39; } }, & # 39;处理程序# 39;:{ & # 39;控制台# 39;:{ & # 39;水平# 39;:LOG_LEVEL, & # 39;类# 39;:& # 39;logging.StreamHandler& # 39; & # 39;格式化程序# 39;:& # 39;颜色# 39; }, & # 39;file1 # 39;: { & # 39;水平# 39;:LOG_LEVEL, & # 39;类# 39;:& # 39;logging.FileHandler& # 39; & # 39;模式# 39;:& # 39;w # 39; & # 39;格式化程序# 39;:& # 39;默认# 39; & # 39;文件名# 39;:& # 39;400 _log.txt& # 39; & # 39;编码# 39;:& # 39;utf - 8 # 39; & # 39;过滤器# 39;:[& # 39;filter_400& # 39;】 }, & # 39;file2 # 39;: { & # 39;水平# 39;:LOG_LEVEL, & # 39;类# 39;:& # 39;logging.FileHandler& # 39; & # 39;模式# 39;:& # 39;w # 39; & # 39;格式化程序# 39;:& # 39;默认# 39; & # 39;文件名# 39;:& # 39;300 _log.txt& # 39; & # 39;编码# 39;:& # 39;utf - 8 # 39; & # 39;过滤器# 39;:[& # 39;filter_300& # 39;】 }, }, & # 39;伐木工# 39;:{ & # 39;__main__ # 39;: { & # 39;处理程序# 39;:[& # 39;file1 # 39; & # 39; file2 # 39;, & # 39;控制台# 39;], & # 39;水平# 39;:LOG_LEVEL, }, } } logging.config.dictConfig(日志) 记录器=logging.getLogger (__name__) logger.debug(& # 39; 200年,这是一个记录器调试消息# 39;) logger.info(& # 39; 302年,这是一个日志信息消息# 39;) logger.warning(& # 39; 301年,这是一个记录器警告消息# 39;) logger.error(& # 39; 404年,这是一个错误日志消息# 39;) logger.critical(& # 39; 500年,这是一个记录器关键消息# 39;) print (“% s"% __name__)逐层解析Python3自定义json