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入门之语句(if语句、while语句、for语句)
Jan 19 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
Jan 17 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
详解python 模拟豆瓣登录(豆瓣6.0)
Apr 18 Python
python通过paramiko复制远程文件及文件目录到本地
Apr 30 Python
python3爬虫中异步协程的用法
Jul 10 Python
python 5个顶级异步框架推荐
Sep 09 Python
详解python命令提示符窗口下如何运行python脚本
Sep 11 Python
Python Pygame实战之塔防游戏的实现
Mar 17 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计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP中模糊查询并关联三个select框
2017/06/19 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
使用TextRange获取输入框中光标的位置的代码
2007/03/08 Javascript
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
用C/C++来实现 Node.js 的模块(二)
2014/09/24 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
JS字符串长度判断,超出进行自动截取的实例(支持中文)
2017/03/06 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
2018/01/15 Javascript
详解Angular如何正确的操作DOM
2018/07/06 Javascript
vue 监听某个div垂直滚动条下拉到底部的方法
2018/09/15 Javascript
js实现批量删除功能
2020/08/27 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python返回数组/List长度的实例
2018/06/23 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
来自全球大都市的高级街头服饰:Pegador
2018/01/03 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
煤矿安全生产标语
2014/06/06 职场文书
食品安全演讲稿
2014/09/01 职场文书
承诺保证书格式
2015/02/28 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
Mysql超详细讲解死锁问题的理解
2022/04/01 MySQL
德生2P3收音机开箱评测
2022/04/30 无线电
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript