逐层解析Python3自定义json

  介绍

这篇文章主要为大家逐层解析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字符串。

设计思路:

逐层解析Python3自定义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