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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
Python set集合类型操作总结
Nov 07 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 Python
Python操作SQLite数据库过程解析
Sep 02 Python
python快速排序的实现及运行时间比较
Nov 22 Python
Python双链表原理与实现方法详解
Feb 22 Python
Python 保存加载mat格式文件的示例代码
Aug 04 Python
Python map及filter函数使用方法解析
Aug 06 Python
浅谈Python __init__.py的作用
Oct 28 Python
Pytorch实验常用代码段汇总
Nov 19 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 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中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
JS Array对象入门分析
2008/10/30 Javascript
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
javascript 中that的含义示例介绍
2014/05/14 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
Bootstrap模态窗口源码解析
2017/02/08 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
jQuery实现滚动到底部时自动加载更多的方法示例
2018/02/18 jQuery
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
python dataframe astype 字段类型转换方法
2018/04/11 Python
django框架自定义用户表操作示例
2018/08/07 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
python图像和办公文档处理总结
2019/05/28 Python
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
小区门卫管理制度
2014/01/29 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
小班下学期个人总结
2015/02/12 职场文书
2015年化验员工作总结
2015/04/10 职场文书
教师节祝酒词
2015/08/11 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
导游词之金鞭溪风景区
2019/09/12 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB