python解析json⽂件案例_Python加载带有注释的Json⽂件实
例
由于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):
python请求并解析json数据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:]
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):
pycharm安装包try:
srcJson = open(JsonPath, 'r')
except:
print CAUTION_PRINT_HEAD + 'cannot open ' + JsonPath
quit()
dstJsonStr = ''
for line adlines():
if not re.match(r'\s*//', line) and not re.match(r'\s*\n', line):
xline = xstr(line)
dstJsonStr += Cmt()
# print dstJsonStr
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 = place(',', ',\n')
resStr = place('{', '{\n')kindeditor实现原理
resStr = place(':{', ':\n{')
resStr = place('}', '\n}')
resStr = place('[', '\n[\n')
resStr = place(']', '\n]')
resStr = resStr
resArray = resStr.split('\n')
preBlank = ''
for line in resArray:
if len(line) == 0:
jqqcontinue
lastChar = line[len(line)-1]
lastTwoChars = line[len(line)-2:]
if lastChar in {'}', ']'} or lastTwoChars in {'},', '],'}:
preBlank = preBlank[:len(preBlank)-2]
invalidparameter弹窗
try:
print preBlank + line.decode('utf-8')
except:
print(preBlank + '[%This line cannot be decoded%]')
if lastChar == '{' or lastChar == '[':
preBlank += ' '*2
以上这篇Python加载带有注释的Json⽂件实例就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论