我的json parser/generator
我的json parser/generator
json parser是用来解析json的工具,按照规则将符合标准json文本转换成相应的数据结构(类)。
-
使用语言 : C++(11)。
-
项目规模 :实现部分700行左右,测试部分400行左右。
-
耗时 :大约一周。
- 功能简介:
[1] 解析器部分:
能解析NULL,False,True,Number(只支持double),String,array,object六种类型。对于常见的出现错误定义了相应的错误码。
[2] 生成器部分:
能够将解析好的数据再转换成为json格式的文本。能够对现有的数据进行修改,实现了添加,修改两部分的功能。对于删除部分尚未实现(to do)。
[3] 测试部分:
对所有类型的解析/生成均做了相应的测试。
对重要API做了相应测试。
- 部分实现:
由于篇幅和精力所限制,我只选择阐述部分较为重要的实现,具体细节可以看源码。
[1]整体框架
我们创建一个叫做json_value的类来存储不同的类型和值,创建json_tree这个类用来解析相应json文本并保存在json_value里面。
(1)json_value的结构
type+(null,false,true,number,string,array,object)
为了节约空间,我们选择使用一个union将这六种类型的变量全部封装起来,但是由于string,vector,map等类型不是简单类型,所以我们必须自己创建相应的构造函数,拷贝构造函数,赋值运算符,析构函数来保证相应的操作的正确执行。
同时我们不直接使 用vector,map
(2)json_tree执行具体的解析
json_tree留给外部使用的接口是lept_parse(const string&)
这个函数负责最外层的判断以及部分处理错误的功能,我们首先写好lept_parse_whitespace()这个函数用来去掉分割用的空格。然后将剩下的工作交给另一个函数lpet_parse_value:检测遇到的第一个字符,根据
(n,f,t,",[,{,其他(数字或者无效值))
这六种首字母的情况,我们可以很容易的确定需要解析的是哪一种。这里我们分别实现对应功能的函数。
[2] Literal(null,false,true):
literal是指普通的字面值类型,一共三种 null,false,true
由于这三种类型非常相似,所以我选择一个函数lept_parse_literal来解析这三种类型,在这个函数里面,我们只需要判断它是三种类型里面的哪一种,并且指定好相应的类型即可。
此外,还需要处理可能发生的错误,比如nul,fuck这种无效的字符。这一块的难度不大,细心即可顺利的完成。
注意,我们还要处理类似 “null x”这样的不正确输入,并且返回的错误类型应该是NOT_SINGULAR_ROOT(该节点不止一个值)。
[3] Number的解析
也许这是整个项目最困难的部分,但是我选择一定程度的回避^_^