由于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解析json文件案例_Python加载带有注释的Json文件实例相关推荐

  1. python读取json文件多个json数据_Python 加载包含多个JSON对象的JSON文件

    defwriteJsonFile(data,outfilename): with open(outfilename+'.json', 'wt',encoding='utf-8') as f:for m ...

  2. python处理csv文件缺失值_python 加载数据是-1为缺失值时替换为空

    最近在工作时,加载数据,原始数据用-1代表缺失值,之前加载的时候替换一直没有成功,后来直接把原文件的给改下,才去替换的. 今天 试了下如下方法,可行: 1. 加载数据时直接加载为str型: 2. 把- ...

  3. 用python的五种方式_Python加载数据的5种不同方式(收藏)

    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 作为初学者,您可能只知道一种使用p andas.read_ ...

  4. python训练好的图片验证_利用keras加载训练好的.H5文件,并实现预测图片

    我就废话不多说了,直接上代码吧! import matplotlib matplotlib.use('Agg') import os from keras.models import load_mod ...

  5. php动态引入js文件路径问题,JavaScript_动态加载外部css或js文件,原理解析:第一步:使用dom创 - phpStudy...

    原理解析:第一步:使用dom创建 应用:1.提高代码的复用,减少代码量:2.添加一个javascript控制器和 session可以实现动态改变页面样式:3.由于是页面是从上到下依次加载文件的,并且边 ...

  6. 安卓加载asset中的json文件_Joomla 4中的Web资源介绍

    Joomla 4中我最喜欢的改进之一是"Web资源"特性.它允许你通过一次调用按特定顺序加载一组JavaScript和CSS文件. 比方说,你希望加载依赖于其他文件的CSS或Jav ...

  7. python3读取网页_python3+selenium获取页面加载的所有静态资源文件链接操作

    软件版本: python 3.7.2 selenium 3.141.0 pycharm 2018.3.5 具体实现流程如下,废话不多说,直接上代码: from selenium import webd ...

  8. GREENPLUM介绍之数据库管理(九)- 使用GPLOAD实现无落地文件的高速加载

    GREENPLUM介绍之数据库管理(九)- 使用GPLOAD实现无落地文件的高速加载     类似于ORACLE SQL*LOADER,gpload是EMC在greenplum中提供的用来进行数据装载 ...

  9. javascript 文件的同步加载与异步加载

    原文:[转载]javascript 文件的同步加载与异步加载 HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值. defer: bool ...

最新文章

  1. 素数环问题---深度搜索遍历
  2. Spring的qualifier标签
  3. 微信公众平台开发之微信access_token如何有效长期保存
  4. c++ 中extern C 及#ifdef __cplusplus的作用
  5. C++一位的字符数字转数字
  6. ES6-Generator使用与改写
  7. idea导入java项目类上面显示红色的J符号解决办法
  8. SAP License:SD和其他模块集成要点
  9. CentOS安装PinPoint
  10. SQL Server AlwaysOn配置两个节点加共享文件夹仲裁见证
  11. SQLsever --数据库置疑
  12. Kali Linux工具大全-信息收集
  13. excel冻结窗格参与排序_冻结窗格以在Excel中隐藏行
  14. Spring——DI
  15. 小程序账号注册完整流程
  16. getchar()函数的作用
  17. 【1+X Web前端等级考证 】 | Web前端开发中级理论 (附答案)
  18. MAE学习 论文阅读与学习 源码阅读
  19. 如何做一名优秀的博士生:(二)方法论的转变
  20. java爬虫webcollector_JAVA爬虫框架:WebCollector

热门文章

  1. Ubuntu16.04 64位 + GTX1070显卡驱动 + CUDA 8.0
  2. ‘telnet‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
  3. mysql 索引 变慢_mysql添加索引,查询反而变慢
  4. 超郁闷的,2010年春节假期(农历新年)放假安排时间表
  5. Nginx——Nginx负载均衡
  6. Android如何跳转至目标Activity后按返回键不返回前一个Activity
  7. kali driftnet
  8. Golang中path/filepath包
  9. SDL入门教程(八):1、裁剪精灵图片(Clip Blitting and Sprite Sheets)
  10. 课题研究过程可能遇到的问题