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实现微信公众平台自定义菜单实例
Mar 20 Python
tensorflow 使用flags定义命令行参数的方法
Apr 23 Python
python3模块smtplib实现发送邮件功能
May 22 Python
python实现txt文件格式转换为arff格式
May 31 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
django 通过url实现简单的权限控制的例子
Aug 16 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
PyQt5+python3+pycharm开发环境配置教程
Mar 24 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
python中使用.py配置文件的方法详解
Nov 23 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 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的博客ping服务代码
2012/02/04 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
preg_match_all使用心得分享
2014/01/31 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
PHP概率计算函数汇总
2015/09/13 PHP
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python操作 hbase 数据的方法
2016/12/18 Python
对python中两种列表元素去重函数性能的比较方法
2018/06/29 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
js实现弹框效果
2021/03/24 Javascript
写给老婆的检讨书
2014/02/21 职场文书
汽车专业求职信
2014/06/05 职场文书
小学秋季运动会报道稿
2014/09/30 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书