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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
Python使用遗传算法解决最大流问题
Jan 29 Python
python实现比较文件内容异同
Jun 22 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
简单了解python反射机制的一些知识
Jul 13 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
python os.path.isfile 的使用误区详解
Nov 29 Python
基于python实现破解滑动验证码过程解析
May 28 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
python基于tkinter制作下班倒计时工具
Apr 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
is_uploaded_file函数引发的不能上传文件问题
2013/10/29 PHP
php实现paypal 授权登录
2015/05/28 PHP
WordPress网站性能优化指南
2015/11/18 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
PHP网站常见安全漏洞,及相应防范措施总结
2021/03/01 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
JS实现多物体缓冲运动实例代码
2013/11/29 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
js中常用的Tab切换效果(推荐)
2016/08/30 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
解决淘宝cnpm 安装后cnpm不是内部或外部命令的问题
2018/05/17 Javascript
JavaScript ES6常用基础知识总结
2019/02/09 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
基于JavaScript 实现拖放功能
2019/09/12 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
python 3.7.0 安装配置方法图文教程
2018/08/27 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python 格式化打印json数据方法(展开状态)
2020/02/27 Python
使用Python对Dicom文件进行读取与写入的实现
2020/04/20 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
新闻系毕业生推荐信
2013/11/16 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
教师廉政准则心得体会
2016/01/20 职场文书