当前位置: 首页 > 工具软件 > JSONParser > 使用案例 >

python自动解析json_JsonParser–使用python编写的json解析器

姜飞飙
2023-12-01

最近在练习python,于是尝试使用python编写json解析器,目前已经大体实现,通过了jsonTestFile.txt中的测试例子。代码github网址为:https://github.com/siukwan/jsonparser

下面重点介绍编写过程中遇到的一些需要注意的问题。

1.json的主体内容

我这里所提及的json主体内容主要是指两大类:1.对象object;2.数组array。

因为一个json格式的字符串不是一个object就是一个array。所以编写jsonparser的类中,有_parse_object和_parse_array两个函数。首先通过parse函数直接判断开始的符号为{还是[进而决定调用_parse_object还是_parse_array。

2.json中的key

标准json格式中的key是string类型,使用双引号包括。其中类中的_parse_string函数专门用来解析key。

3.json中的value

json中的value相对复杂,类型可以是object,array,string,数字,true,false,null。

在编写过程中,我刚开始没有编写解析嵌套的object和array,先编写了_parse_number和_parse_string。我们在解析了key后,会遇到冒号:,然后跳过冒号,我们进一步判断非空字符,如果为”,则接下来是string,否则的话接下来是number。

number中需要注意的是,我们要判断是整型还是浮点数,需要进行一个int或float的强制转换。json中小数的表达方式有科学记数法和普通的小数点表示法,所以如果字符串中包含e、E和.则强制转换成float,其他转换成int。

完成上述解析后,我们开始考虑解析嵌套的object和array。如果遇到的字符为{则调用_parse_object函数,遇到[则调用_parse_array函数。我们把value解析统一封装到函数_parse_value中,如下:

def _parse_value(self):

'''

解析值,包括string,数字

'''

c = self._str[self._index]

#解析对象

if c == '{':

self._index+=1

self._skipBlank()

return self._parse_object()

#解析数组

elif c == '[':

#array

self._index+=1

self._skipBlank()

return self._parse_array()

#解析string

elif c == '"':

#string

self._index += 1

self._skipBlank()

return self._parse_string()

#解析null

elif c=='n' and self._str[self._index:self._index+4] == 'null':

#null

self._index+=4

return None

#解析bool变量true

elif c=='t' and self._str[self._index:self._index+4] == 'true':

#true

self._index+=4

return True

#解析bool变量false

elif c=='f' and self._str[self._index:self._index+5] == 'false':

#false

self._index+=5

return False

#剩下的情况为number

else:

return self._parse_number()

其中开始parse函数只会调用_parse_object或者_parse_array,而这两个函数中的value解析又有可能继续调用_parse_object或者_parse_array,从而实现了json对象或数组的嵌套解析。

4.避开空格

json字符串或者文件中,非key或非value的地方可能会存在换行,空格,缩进等,所以编写了_skipBlank函数,跳过这些空格。

5.记录当前解析的位置

使用了类成员_index来记录当前解析的位置,其中这个部分比较多细节,不是很难,具体请查看代码。

 类似资料: