json解析原理
来源:互联网 发布:作品集网站 知乎 编辑:程序博客网 时间:2024/05/01 01:57
json解析原理之Gson
目标:了解json对象解析的大概过程
在这个序列化和反序列化的过程中,Gson充当的了一个解析器的角色。
第一阶段:了解Gson数据类型及其关系
第一:JsonElement(超级父类) 看JsonElement类的源码
- 抽象类
- 代表json串的某一个元素
- 某一个元素:
- JsonObject
- JsonArray
- JsonPrimitive(基本类型)
- JsonNull
第二:JsonElement的四个子类 看JsonElement类的源码
- JsonObject、JsonArray、JsonPrimitive、JsonNull
- JsonElement提供了一系列的方法来判断当前的JsonElement属于哪个子类
- isJsonArray()
- isJsonObject()
- isJsonPrimitive()
- isJsonNull()
- 同时,该类也提供了把当前JsonElement作为上述子类的一种返回的方法
- getAsJsonArray()
- getAsJsonObject()
- getAsJsonNull()
- getAsJsonPrimitive();
- 第三:JsonPrimitive 看JsonPrimitive类的源码
JsonElement的子类,该类对Java的基本类型及其对应的对象类进行了封装
Java的基本数据类型(短整长,单精双精,字符<表示为单字符字符串>,布尔)- isBoolean()
- isNumber():包含短整长,单双精,字节
- isPrimitiveOrString():包含字符和字符串
- 第四:JsonArray,JsonPrimitive,JsonNull
很常见的json对象
第二阶段:Gson对象的产生
- Gson对象的产生
- 通过new Gson()方式
使用的都是默认的配置 - 通过JsonBuilder的方式
自定义一些配置选项,版本支持,输出,定制序列化、反序列化和构造器等。- 建造者模式:设计者模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- 通过new Gson()方式
通过new Gson()方式产生
通过这种方式创建的Gson对象,将用Java的反射机制来完成json的解析
调用无参构造方法时,会默认调用有参构造方法,将大量默认的TypeAdapterFactory添加到factories中,生成默认的Gson对象通过GsonBuilder方式产生
通过这种方式产生的Gson对象,将使用自定义的TypeAdapter来完成json的解析
TypeAdapter:该类的作用就是把json串封装成你指定的Java对象- 通过GsonBuilder注册TypeAdapter,并把TypeAdapter封装成TypeAdpterFactory对象
- 将封装成的TypeAdapterFactory通过GsonBuilder的create传入Gson对象中并返回
- 调用gson.fromJson方法,调用getTypeAdapter方法返回你自定义的Adapter
判断Gson对象是那种方式产生的
通过遍历factories得到里面的TypeAdapterFactory
添加到factories(list)中的顺序为先添加自定义的TypeAdapterFactory,再添加系统自带的TypeAdapterFactory
只要得到一个不为空就返回,这样就可以得到自定义的TypeAdapterFactory。
第三阶段:通过反射将json对象转化成java对象
0 0
- 解析JSON的原理
- json解析原理
- json解析及解析原理
- 理解jQuery解析JSON数据对象原理
- 【JSON解析】JSON解析
- Java实现自己的Json解析器——Json字符串解析原理
- 关于Json数据的解析工具及原理
- json解析 原理,或者是oc基础语法
- Json 原理
- JSOn、XML的区别以及JSOn、XML解析方式的底层处理原理
- 解析JSON
- Json解析
- JSON解析
- JSON解析
- json解析
- Json解析
- Json解析
- JSON解析
- SDUT 3257 Cube Number 素数筛的应用加强版 立方数的性质
- (java)Leetcode-15. 3Sum
- Matika版OpenStack伪生产环境部署-创建网络
- application/octet-stream
- 使用golang实现telnet远程登录
- json解析原理
- 九度 OJ 1054:字符串内排序
- 2016-05-25 margin-right jsp获取页面流变量 文字颜色
- 合并排序
- 多线程编程艺术(3)-多线程等待通知编程模型
- ListView之ArrayAdapter的使用
- cordys CWS 编译失败 需要指定 JRE
- JAVA 笔记(三) 从源码深入浅出集合框架
- LinkedHashMap源码解析