一.Json解析的两种方式
{
"name":"ljh",
"age":21
}
①一次性全部解析完(适用于元素较少):比如DOM解析
这个就一次性解析成"{" , ""name":"ljh"" , "," , ""age":21" , "}"
。然后才使用
一次性加载到内存
②基于事件驱动的(适用于元素较多):比如SAX,PULL解析
与上面的相反,并不是一次性将Json对象全部解析完,而是一个一个地解析
比如解析到{的时候就能判断它是一个object
可以需要的时候才加载到内存,省内存但是效率较低。
二.Json词法分析——JsonToken类
如果要自己解析Json,首先要一个一个地把Json字符串分开,比如先分{,然后分",然后是属性名,然后是",等等,最后是}。而标志这些的,就是JsonToken
。Token
意为令牌
其对应关系如下
Json语法分析
三.JsonElement
这是一个抽象类,代表着json串的某一个元素,这个元素可以是一个Json(对应JsonElement
的JsonObject
子类),可以是一个数组(对应JsonElement
的JsonArray
子类),可以是一个Java的基本类型(对应JsonElement
的JsonPrimitive
子类),可以是一个null
(对应JsonElement
的JsonNull
子类)
四个子类示意图
四.TypeAdapter
TypeAdapter
的作用和基本使用在上一篇文章中已有详细介绍,在这里主要讲下源码
可以看到它是一个抽象类,有两个抽象方法,分别是write
和read
。除此之外,我们还看到了上一篇文章中提到的null
处理方法nullSafe
。这里让我们看一下它到底是怎么处理的
1.nullSafe
方法
它返回一个TypeAdapter