在开始正文之前,先给大家推荐一些学习技巧:
- 大牛的C语言版JOSN,万事开头难,我开始在网上找资料就花了很长时间,而且资料太多,众说纷纭…但是最后找到了这个大牛的,真的写的超级好,超级详细,虽然他是用C语言写的,哈哈~就这样我跟着大牛的文档和代码写了一遍C语言的JSON后,对JSON的语法以及实现有了一个初级的了解,然后,我就开始着手写Java版的JSON啦
- 在线JOSN校验格式化工具,如果在解析字符串的时候,拿不准这个是不是正确的JOSN,你可以在这个上面测试一下,有利于对自己代码的测试(我的测试代码写的特别挫,后序再改进,哈哈)
- 温馨提示:代码有点长,所以不会全部粘贴,可以先下载(Java实现Json解析器)下来再看文哦~
- 温馨提示:不建议大家看源码…因为我在写之前,为了看起来专业一点,然后我就想要不要用一下人家的源码的接口或者参考一下人家的代码什么的…然后我就开始了看fastjosn源码的不归路…看了一下午,我放弃了,实在是看不太懂哇~但是要是想看的话也可以看看,学学人家的代码,也没有什么坏处
总体介绍
其次,说一下,整个JSON解析使用的是遍历分析(词法解析)、灵活应用堆栈来实现(语法解析),没有使用递归方式,这样就免受了JVM调用堆栈溢出问题的困饶。
先看看文件结构:
Lexical-----词法解析,就是字符串解析(主要就是解析为true、false、null、String、num这几种基本类型)。Type类,定义了JOSN的数据类型;JsonLex类就是粗略的判断了下输入数据的JSON类型和大概的值;LeptType类保存数据的类型和真实值;UnexpectedException类自定义一个捕获错误类,用于报错。
Grammar-----语法解析,就是利用栈和HashMap等数据结构来解析数组和对象这两种符合结构。STATE类,定义状态常量;StateMachine类(总指挥官)将所有状态转化都联系起来实现JSON解析器;OPT类定义操作常量;Operator类具体操作类。
看文档顺序
- 词法解析:TestJsonLex->Type->JsonLex->LeptType->UnexpectedException
- 语法解析:TestJsonGrammar->JSON->Status->StatusMachine->OPT->Operator
词法解析
主要就是解析为true、false、null、String、num这几种基本类型。
Type类:
定义‘[’ ‘]’ ‘{’ ‘}’ ‘,’ ':'等类型是为了后面状态转换用。
JsonLex类:
public LeptType leptParseValue() {
if (lineNum == 0) {
lineNum++;
return LeptType.BGN;
}
char ch;
while ((ch = nextChar()) != 0) {
startLine = this.lineNum;
startCol = getColNum();
switch (ch) {
case '[':
return LeptType.ARRS;
case ']':
return LeptType.ARRE;
case '{':
return LeptType.OBJS;
case '}':
return LeptType.OBJE;
case ',':
return LeptType.SPLIT;
case ':':
return LeptType.DESC;
case 't':
case 'f':
case 'n':
return getDefLeptType();
case '&#