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使用Flask框架同时上传多个文件的方法
Mar 21 Python
基于wxpython开发的简单gui计算器实例
May 30 Python
django表单实现下拉框的示例讲解
May 29 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
彻底理解Python中的yield关键字
Apr 01 Python
django框架模板中定义变量(set variable in django template)的方法分析
Jun 24 Python
Python的log日志功能及设置方法
Jul 11 Python
Django打印出在数据库中执行的语句问题
Jul 25 Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 Python
python3爬虫中引用Queue的实例讲解
Nov 24 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
《PHP编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php实现购物车功能(下)
2016/01/05 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
jquery ajax 局部刷新小案例
2014/02/08 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
js实现tab切换效果
2017/02/16 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
js编写简单的聊天室功能
2017/08/17 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
js 显示日期时间的实例(时间过一秒加1)
2017/10/25 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
PyTorch上实现卷积神经网络CNN的方法
2018/04/28 Python
Django开发中的日志输出的方法
2018/07/02 Python
python仿抖音表白神器
2019/04/08 Python
详解Python的循环结构知识点
2019/05/20 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
Python 读取xml数据,cv2裁剪图片实例
2020/03/10 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
整改报告格式
2014/11/06 职场文书
员工评语范文
2014/12/31 职场文书
学习保证书
2015/01/17 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
Javascript使用integrity属性进行安全验证
2021/11/07 Javascript