如何实现一个简单的json数据格式解析器

项目地址: https://github.com/zhiruchen/json-parse
因为平时工作里涉及到对请求和响应数据的json编解码,所以一直想实现一个json数据解析工具。在这里记录一下设计实现过程。

basics

  • json 数据的值类型包括: 字符串,布尔值,列表,json 对象, 数字

  • json 数据的键是字符串

  • json 数据是一个有递归结构的数据结构

  • json 语法

解析器的组成部分

  • scanner 负责将读取的json字符串分割为一个个token

  • parser 解析token并生成一个JSONObject

Scanner

scanner 主要作用是遍历字符串,将一个个字符分组为一个个token.

Token

token 是解析器用来识别并解析为响应的数据结构。
token的结构

1
2
3
4
5
6
type Token struct {
TokenType Type // token 类型: 字符串,数字,列表,etc...
Lexeme string // 字面量
Literal interface{} // 实际的值,用interface{} 表示一切可能的值
Line int // token 所在行数
}

token 主要分为 普通的token(字符串,数子,大括号等, 还有是内置的标识符(true, false, null)

Parser

parser 解析token 并生成JSONObject, 从json.org上能得知解析的语法基础,解析的顺序。
json 语法

1
2
3
4
5
6
7
json     -> obj |  array ;
obj -> "{" members "}"
members -> pair ("," pair)* ;
pair -> STRING ":" value;
value -> STRING | NUMBER | true | false | null | obj | array;
array -> "[" elements "]";
elements -> value ("," value)*;

解析流程

Json Parse