概述
附上完整的代码:
https://pan.baidu.com/s/1dEDmGz3
(入口类是Json)
JSON:JavaScript 对象表示法(JavaScript Object Notation)。
JSON 是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
在JSON中,分为6种对象:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(JsonArray)
- 对象(JsonObject)
- null
基本对象的实现
JsonObject其实就是一个HashMap,JsonArray其实就是一个ArrayList.
public class JsonObject extends HashMap<String,Object> {
}
public class JsonArray extends ArrayList<Object> {
}
JSON字符串的解析
以这个字符串为例:
{“success”:true,”id”:-10.5,”employees”:[{“firstName”:”Bill”,”lastName”:”Gates”},{“firstName”:”George”,”lastName”:”Bush”},{“firstName”:”Thomas”,”lastName”:”Carter”}]}
我们保证在只扫描一次整个的情况下,就将json结构解析成功。
传统的解析策略通常是通过词法分析,将json分为一个个的token,而这些token有着自己的类型和值;再通过语法分析构建一棵抽象语法树,进一步处理。通常需要定义一个enum枚举类型表示Token,或者用一个数组来表示Token。
enum表示
public enum TokenType {
START_OBJ, END_OBJ, START_ARRAY, END_ARRAY, NULL, NUMBER, STRING, BOOLEAN, COLON, COMMA, END_DOC
}
数组表示
public static final String[] CAST_STRS = { "STR", "NUM", "DESC", "SPLIT",
"ARRS", "OBJS", "ARRE", "OBJE", "FALSE", "TRUE", "NIL", "BGN", "EOF" };
其实根本不需要这么复杂。依我看来,json的token只有五种:true/false/null(归为一种