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命令行参数解析模块getopt使用实例
Apr 13 Python
简单了解Python中的几种函数
Nov 03 Python
python批量赋值操作实例
Oct 22 Python
在ubuntu16.04中将python3设置为默认的命令写法
Oct 31 Python
Python3.5装饰器原理及应用实例详解
Apr 30 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
python使用Matplotlib改变坐标轴的默认位置
Oct 18 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
基于plt.title无法显示中文的快速解决
May 16 Python
Python绘图之二维图与三维图详解
Aug 04 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 Python
Python中可变和不可变对象的深入讲解
Aug 02 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
动易数据转成dedecms的php程序
2007/04/07 PHP
php class类的用法详细总结
2013/10/17 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
Vue DevTools调试工具的使用
2017/12/05 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
JS实现点击按钮可实现编辑功能
2018/07/03 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
详解vue在项目中使用百度地图
2019/03/26 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
Python 中迭代器与生成器实例详解
2017/03/29 Python
python 内置函数filter
2017/06/01 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
后勤采购员岗位职责
2013/12/19 职场文书
演讲稿怎么写才完美
2014/01/02 职场文书
学生操行评语大全
2014/04/24 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
匿名信格式范文
2015/05/27 职场文书
工资证明格式模板
2015/06/12 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL