Python加载带有注释的Json文件实例


Posted in Python onMay 23, 2018

由于json文件不支持注释,所以如果在json文件中标记了注释,则使用python中的json.dump()无法加载该json文件。

本文旨在解决当定义“//”为json注释时,如何正确解析有注释的json文件。

程序实现

# encoding: utf-8
import json
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
CAUTION_PRINT_HEAD = 'caution: '
# 创建一个xstr类,用于处理从文件中读出的字符串
class xstr:
 def __init__(self, instr):
  self.instr = instr
 # 删除“//”标志后的注释
 def rmCmt(self): 
  qtCnt = cmtPos = slashPos = 0
  rearLine = self.instr
  # rearline: 前一个“//”之后的字符串,
  # 双引号里的“//”不是注释标志,所以遇到这种情况,仍需继续查找后续的“//”
  while rearLine.find('//') >= 0: # 查找“//”
   slashPos = rearLine.find('//')
   cmtPos += slashPos
   # print 'slashPos: ' + str(slashPos)
   headLine = rearLine[:slashPos]
   while headLine.find('"') >= 0: # 查找“//”前的双引号
    qtPos = headLine.find('"')
    if not self.isEscapeOpr(headLine[:qtPos]): # 如果双引号没有被转义
     qtCnt += 1 # 双引号的数量加1
    headLine = headLine[qtPos+1:]
    # print qtCnt
   if qtCnt % 2 == 0: # 如果双引号的数量为偶数,则说明“//”是注释标志
    # print self.instr[:cmtPos]
    return self.instr[:cmtPos]
   rearLine = rearLine[slashPos+2:]
   # print rearLine
   cmtPos += 2
  # print self.instr
  return self.instr
 # 判断是否为转义字符
 def isEscapeOpr(self, instr):
  if len(instr) <= 0:
   return False
  cnt = 0
  while instr[-1] == '\\':
   cnt += 1
   instr = instr[:-1]
  if cnt % 2 == 1:
   return True
  else:
   return False
# 从json文件的路径JsonPath读取该文件,返回json对象
def loadJson(JsonPath):
 try:
  srcJson = open(JsonPath, 'r')
 except:
  print CAUTION_PRINT_HEAD + 'cannot open ' + JsonPath
  quit()
 dstJsonStr = ''
 for line in srcJson.readlines():
  if not re.match(r'\s*//', line) and not re.match(r'\s*\n', line):
   xline = xstr(line)
   dstJsonStr += xline.rmCmt()
 # print dstJsonStr
 dstJson = {}
 try:
  dstJson = json.loads(dstJsonStr)
  return dstJson
 except:
  print CAUTION_PRINT_HEAD + JsonPath + ' is not a valid json file'
  quit()
# 带缩进地在屏幕输出json字符串
def printRes(resStr):
 resStr = resStr.replace(',', ',\n')
 resStr = resStr.replace('{', '{\n')
 resStr = resStr.replace(':{', ':\n{')
 resStr = resStr.replace('}', '\n}')
 resStr = resStr.replace('[', '\n[\n')
 resStr = resStr.replace(']', '\n]')
 resStr = resStr
 resArray = resStr.split('\n')
 preBlank = ''
 for line in resArray:
  if len(line) == 0:
   continue
  lastChar = line[len(line)-1]
  lastTwoChars = line[len(line)-2:]
  if lastChar in {'}', ']'} or lastTwoChars in {'},', '],'}:
   preBlank = preBlank[:len(preBlank)-2]
  try:
   print preBlank + line.decode('utf-8')
  except:
   print(preBlank + '[%This line cannot be decoded%]')
  if lastChar == '{' or lastChar == '[':
   preBlank += ' '*2

以上这篇Python加载带有注释的Json文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python批量修改文件后缀的方法
Jan 26 Python
教你用Type Hint提高Python程序开发效率
Aug 08 Python
详解python发送各类邮件的主要方法
Dec 22 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
python字典改变value值方法总结
Jun 21 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 Python
神经网络训练采用gpu设置的方式
Mar 03 Python
Python实现判断一行代码是否为注释的方法
May 23 #Python
对python的文件内注释 help注释方法
May 23 #Python
Python基于生成器迭代实现的八皇后问题示例
May 23 #Python
Pycharm 操作Django Model的简单运用方法
May 23 #Python
PyCharm代码格式调整方法
May 23 #Python
创建pycharm的自定义python模板方法
May 23 #Python
对Python中9种生成新对象的方法总结
May 23 #Python
You might like
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
B/S开发中常用javaScript技术与代码
2007/03/09 Javascript
js电信网通双线自动选择技巧
2008/11/18 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
使用JS 插件qrcode.js生成二维码功能
2017/02/20 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
python遍历数组的方法小结
2015/04/30 Python
python实现用户登录系统
2016/05/21 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Python3中configparser模块读写ini文件并解析配置的用法详解
2020/02/18 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
python 8种必备的gui库
2020/08/27 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
旅游管理实习自我鉴定
2013/09/29 职场文书
英语专业毕业生求职简历的自我评价
2013/10/24 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
2016年助残日旅游活动总结
2016/04/01 职场文书
app场景下uniapp的扫码记录
2022/07/23 Java/Android