Human Readable JSON To Thrift POJO「Base Apache Thrift 0.9.2」
- 目前涉及 Thrift POJO 和 JSON 转化的
Apache Thrift
原生Protocol
只有两种:TSimpleJSONProtocol
和TJSONProtocol
TSimpleJSONProtocol
能把 Thrift POJO 转换成 Human Readable JSON ,但是没法把 JSON 反序列化成 Thrift POJOTJSONProtocol
可以在 Thrift POJO 和 JSON 之间相互转换,但是这个 JSON 没有字段的名称信息,是以字段 ID 作为名称,这个 JSON 对人来说几乎是不可读的,无法提供给用户进行修改
- 完成 Thrift POJO 到 Human Readable JSON 再把 Human Readable JSON 到 Thrift POJO 的转换
- 提供统一的解决方案能够支持泛化的 Thrift POJO,即:只要有
.thrift
文件通过 Thrift compile 生成的.java
,就可开箱即用
- 基于痛点的问题,最终考虑通过把
TSimpleJsonProtocol
生成的 Human Readable JSON 进行Rebuild
处理成TJSONProtocol
支持的形式完成 JSON 到 Thrift POJO 的转换 - 具体设计思路如上图,结合 Thrift POJO 和 JSON 中的信息,提取出字段的 名称、类型、ID、Size 等信息
- 使用
Gson
的JsonReader
读取输入 JSON - 利用 JSON 中字段 Name 通过递归反射的方式来获取到 Thrift POJO Class 中的 Type、ID 等信息
- 同时通过遍历 JSON 的方式来获取到 Size 信息
- 将两部分信息组合到临时的数据结构
ThriftMeta
中,动态生成TJSONProtocol
能够处理的 JSON,完成反序列化
- 使用
由于
TSimpleJsonProtocol
在序列化binary
类型的字段的时候是直接采用了toString
方法,而TJsonProtocol
在序列化binary
类型的字段的时候则是使用了Base64
编码,经过Rebuild
处理会导致binary
字段不可用的问题
- 基于上述问题,重写了
TSimpleJsonProtocol
,修改了写binary
类型字段的方法,详情参考NewTSimpleJsonProtocol.java