|
| 1 | +# Json 转换 |
| 2 | + |
| 3 | +## 概述 |
| 4 | + |
| 5 | +tio-boot 的 json 模块以抽象类 Json 为核心,方便扩展第三方实现,tio-boot 官方给出了 4 个 Json 实现,分别是 TioJson、FastJson、Jackson,Gson 这 4 个实现继承自抽象类 Json。 |
| 6 | + |
| 7 | +抽象类 Json 的核心抽象如下: |
| 8 | + |
| 9 | +``` |
| 10 | +public abstract class Json { |
| 11 | + public abstract String toJson(Object object); |
| 12 | + public abstract <T> T parse(String jsonString, Class <T> type); |
| 13 | +} |
| 14 | +``` |
| 15 | + |
| 16 | +如上代码可以看出 Json 抽象就是 Object 与 json string 互转的两个方法,toJson(...)将任意 java 类型转成 json string,而 parse 将 json string 再反向转成范型指定的对象。 |
| 17 | + |
| 18 | +## Json 配置 |
| 19 | + |
| 20 | +tio-boot 官方提供了 Json 抽象类的三个实现:TioJson、FastJson、Jackson,如果不进行配置,那么默认使用 TioJson 实现,指定为其它实现需要在 configConstant 进行如下配置: |
| 21 | + |
| 22 | +``` |
| 23 | +JsonManager.me().setDefaultJsonFactory(new FastJsonFactory()); |
| 24 | +``` |
| 25 | + |
| 26 | +上面配置将系统默认使用的 TioJson 切换到了 FastJson。还可以通过扩展 Json 抽象类以及 JsonFactory 来实现定制的 Json 实现。 |
| 27 | + |
| 28 | +假定用户扩展出了一个 MyJson 与 MyJsonFactory ,那么可以通过如下的方式切换到自己的实现上去: |
| 29 | + |
| 30 | +``` |
| 31 | +JsonManager.me().setJsonFactory(new MyJsonFactory()); |
| 32 | +``` |
| 33 | + |
| 34 | +此外,tio-boot 官方还提供了 MixedJson、MixedJsonFactory 实现,这个实现让转 json string 时使用 TioJson,反向转成对象则使用 FastJson。 |
| 35 | +如果希望在非 web 下进行配置,需要使用 JsonManager,例如: |
| 36 | + |
| 37 | +``` |
| 38 | +JsonManager.me().setJsonFactory(new MixedJsonFactory()); |
| 39 | +``` |
| 40 | + |
| 41 | +还可以配置 Date 类型转 json 后的格式: |
| 42 | + |
| 43 | +``` |
| 44 | +JsonManager.me().setJsonDatePattern("yyyy-MM-dd"); |
| 45 | +``` |
| 46 | + |
| 47 | +注意,在使用 MixedJsonFactory、FastJsonFactory、JacksonFactory 时需要添加其依赖,具体依赖参考下一小节内容。 |
| 48 | + |
| 49 | +## Json 的实现 |
| 50 | + |
| 51 | +官方默认给出了 5 种 json 实现:TioJson、FastJson、Jackson、MixedJson,Gson 可以满足绝大多数需求。 |
| 52 | + |
| 53 | +### 1、TioJson |
| 54 | + |
| 55 | +TioJson 是 tio-boot 官方最早的一个实现,目前已经没有什么用 |
| 56 | + |
| 57 | +### 2、FastJson |
| 58 | + |
| 59 | +FastJson 是对第三方的 fastjson2 进行的二次封装,该实现最重要的一点就是转换依赖于 Model、java bean 的 getter 方法。使用 fastjson 可以按照其官方文档去配置 fastjson 的各种转换参数。 |
| 60 | + |
| 61 | +使用 FastJson 封装时,需要添加其依赖: |
| 62 | + |
| 63 | +``` |
| 64 | + <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --> |
| 65 | + <dependency> |
| 66 | + <groupId>com.alibaba.fastjson2</groupId> |
| 67 | + <artifactId>fastjson2</artifactId> |
| 68 | + <version>${fastjson.version}</version> |
| 69 | + </dependency> |
| 70 | +``` |
| 71 | + |
| 72 | +### 3、Jackson |
| 73 | + |
| 74 | +该实现与 FastJson 类似,是对第三方的 jackson 的二次封装 |
| 75 | + |
| 76 | +使用 Jackson 封装时,需要添加其依赖: |
| 77 | + |
| 78 | +``` |
| 79 | +<dependency> |
| 80 | + <groupId>com.fasterxml.jackson.core</groupId> |
| 81 | + <artifactId>jackson-databind</artifactId> |
| 82 | + <version>2.11.0</version> |
| 83 | +</dependency> |
| 84 | +``` |
| 85 | + |
| 86 | +### 4、Gson |
| 87 | + |
| 88 | +该实现与 FastJson 类似,是对第三方的 Gson 的二次封装 |
| 89 | + |
| 90 | +使用 Gson 封装时,需要添加其依赖: |
| 91 | + |
| 92 | +``` |
| 93 | + <dependency> |
| 94 | + <groupId>com.google.code.gson</groupId> |
| 95 | + <artifactId>gson</artifactId> |
| 96 | + <version>2.10.1</version> |
| 97 | + </dependency> |
| 98 | +``` |
| 99 | + |
| 100 | +### 5、MixedJson |
| 101 | + |
| 102 | +MixedJson 是对 TioJson、FastJson 的再一次封装,Object 转 json string 时使用 TioJson 的实现,而反向 json string 转 Object 使用 FastJson。 |
| 103 | + |
| 104 | +这个实现结合了 TioJson 与 FastJson 两者的优势。 前者不支持 json string 到 Object 的转换,后者不支持关联表 sql 查询动态字段的转换。 |
| 105 | + |
| 106 | +使用 MixedJson 封装时需要添加 FastJson 封装的依赖: |
| 107 | + |
| 108 | +``` |
| 109 | + <!-- https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 --> |
| 110 | + <dependency> |
| 111 | + <groupId>com.alibaba.fastjson2</groupId> |
| 112 | + <artifactId>fastjson2</artifactId> |
| 113 | + <version>${fastjson.version}</version> |
| 114 | + </dependency> |
| 115 | +``` |
| 116 | + |
| 117 | +## 12.4 Json 转换用法 |
| 118 | + |
| 119 | +json 转换在 tio-boot 中的使用分为两类用法,第一类是使用配置的 json 转换,第二类是指定某个实现进行 json 转换。 |
| 120 | + |
| 121 | +### 1、使用配置的 json 实现转换 |
| 122 | + |
| 123 | +如下代码将使用前面章节中介绍的配置的 json 实现进行转的换: |
| 124 | + |
| 125 | +1. 使用 Json 类进行 json 转换 |
| 126 | + |
| 127 | +``` |
| 128 | +Json.getJson().toJson(object) |
| 129 | +Json.getJson().parse(jsonString, type); |
| 130 | +``` |
| 131 | + |
| 132 | +2. 使用 JsonUtils 工具类进行转换 |
| 133 | + |
| 134 | +``` |
| 135 | +import com.litongjava.tio.utils.json.JsonUtils |
| 136 | +
|
| 137 | +JsonUtils.toJson(object) |
| 138 | +JsonUtils.parse(jsonString, type); |
| 139 | +``` |
| 140 | + |
| 141 | +3、使用指定的 json 实现转换 |
| 142 | + |
| 143 | +如果下代码将使用指定的 json 实现去转换: |
| 144 | + |
| 145 | +``` |
| 146 | +// 临时指定使用 FastJson 实现 |
| 147 | +FastJson.getJson().toJson(...); |
| 148 | +FastJson.getJson().parse(...); |
| 149 | +
|
| 150 | +``` |
| 151 | + |
| 152 | +4. Action 直接返回对象今后转换 |
| 153 | + |
| 154 | +``` |
| 155 | +public Student get(){ |
| 156 | + return new Studnet(); |
| 157 | +} |
| 158 | +``` |
| 159 | + |
| 160 | +上面这种用法可以临时摆脱配置的 json 实现,从而使用指定的 json 实现。 |
0 commit comments