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生成器generator之next和send的运行流程(详解)
May 08 Python
python链接oracle数据库以及数据库的增删改查实例
Jan 30 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Python爬虫包BeautifulSoup学习实例(五)
Jun 17 Python
python3实现磁盘空间监控
Jun 21 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
python的pytest框架之命令行参数详解(上)
Jun 27 Python
python腾讯语音合成实现过程解析
Aug 01 Python
wxpython绘制圆角窗体
Nov 18 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
Python如何读取、写入JSON数据
Jul 28 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数组
2006/10/09 PHP
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
PHP接入支付宝接口失效流程详解
2020/11/10 PHP
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
javascript框架设计读书笔记之种子模块
2014/12/02 Javascript
javascript实现的网站访问量统计代码
2015/12/20 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
Bootstrap按钮组实例详解
2017/07/03 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
python求质数列表的例子
2019/11/24 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
大专学生推荐信范文
2013/11/19 职场文书
12岁生日演讲稿
2014/05/14 职场文书
学生安全承诺书
2014/05/22 职场文书
大学生党员自我批评思想汇报
2014/10/10 职场文书
工作检讨书500字
2014/10/19 职场文书
影视后期实训报告
2014/11/05 职场文书
员工离职通知函
2015/04/25 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js