gpt4 book ai didi

Python加载带有注释的Json文件实例

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python加载带有注释的Json文件实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

由于json文件不支持注释,所以如果在json文件中标记了注释,则使用python中的json.dump()无法加载该json文件.

本文旨在解决当定义“//”为json注释时,如何正确解析有注释的json文件.

程序实现 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# 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文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/Foolishwolf_x/article/details/73177781 。

最后此篇关于Python加载带有注释的Json文件实例的文章就讲到这里了,如果你想了解更多关于Python加载带有注释的Json文件实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com