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跳出循环语句continue与break的区别
Aug 25 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
python脚本替换指定行实现步骤
Jul 11 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
Python实现合并两个列表的方法分析
May 28 Python
Numpy中的mask的使用
Jul 21 Python
对numpy中向量式三目运算符详解
Oct 31 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
Python线程之定位与销毁的实现
Feb 17 Python
python能开发游戏吗
Jun 11 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
Python析构函数__del__定义原理解析
Nov 20 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
4月1日重磅发布!《星际争霸II》6.0.0版本更新
2020/04/09 星际争霸
php分页函数
2006/07/08 PHP
PHP:风雨欲来 路在何方?
2006/10/09 PHP
PHP脚本的10个技巧(4)
2006/10/09 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
numpy自动生成数组详解
2017/12/15 Python
使用Python设计一个代码统计工具
2018/04/04 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
超简单使用Python换脸实例
2019/03/27 Python
详解python读取image
2019/04/03 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
PHP面试题及答案一
2012/06/18 面试题
学期自我鉴定
2013/11/04 职场文书
社会实践活动总结报告
2014/04/29 职场文书
幼师个人总结范文
2015/02/28 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
2016年清明节寄语
2015/12/04 职场文书