fastjson2/docs/fastjson_1_upgrade_cn.md

134 lines
7.1 KiB
Markdown
Raw Permalink Normal View History

2022-05-21 17:17:26 +08:00
# FASTJSON 1.x升级指南
## 1. 为什么要升级
2022-10-05 16:04:15 +08:00
* 性能更好,具体性能数据 https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark
2022-05-21 17:17:26 +08:00
* 支持JDK新特性包括JDK 14引入的RecordLambda表达式的更原生支持GraalVM Native-Image支持
* 原生支持kotlin
2022-10-05 16:04:15 +08:00
* 支持 JSON Schema https://github.com/alibaba/fastjson2/wiki/json_schema_cn
2022-05-21 17:17:26 +08:00
* 统一文本和二进制API在RPC、Redis场景也可以使用FASTJSON v2
2022-10-05 16:04:15 +08:00
* 更安全完全删除autoType白名单提升安全性 https://github.com/alibaba/fastjson2/wiki/fastjson2_autotype_cn
2022-05-21 17:17:26 +08:00
* 新版本会长期维护目标为下一个时间提供高性能JSON库提需求能更快得到响应提BUG也更快修复
## 2. 如何升级
### 2.1. 如何获得最新版本
2022-05-21 17:53:19 +08:00
FASTJSON v2项目目前处于活跃状态会不定期发布新版本你可以在fastjson2发布地址中获得最新版本 [https://github.com/alibaba/fastjson2/releases](https://github.com/alibaba/fastjson2/releases)
2022-05-21 17:17:26 +08:00
可以两种模式升级:
* 兼容模式
* 使用fastjson v2新的API
### 2.2. 兼容模式升级
2022-05-21 17:53:19 +08:00
升级可以通过兼容模式升级,兼容模式不需要改代码,但在深度使用的场景,不能做到完全兼容,通过这样的模式升级虽然省事,请认证测试,遇到问题反馈到 [https://github.com/alibaba/fastjson2/issues](https://github.com/alibaba/fastjson2/issues)
2022-05-21 17:17:26 +08:00
* 兼容模式Maven依赖
```xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson2.version}</version>
</dependency>
```
### 2.3. 使用新API升级
使用新API是建议的升级方式使用新的API能获得更多的功能。
* 包名编程
`FASTJSON` v2和1.x版本使用不同的package新的package名称是com.alibaba.fastjson2新package和之前不同可以实现1.x和2.x共存
```java
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONArray;
```
* Maven依赖
Maven依赖的groupId和1.x不同使用了新的groupId`com.alibaba.fastjson2`
```xml
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
```
如果你需要用到spring支持的功能还需要依赖`fastjson2-extension`
```xml
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-extension</artifactId>
<version>${fastjson2.version}</version>
</dependency>
```
如果你是在kotlin中使用fastjson需要依赖`fastjson2-kotlin`
```xml
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2-kotlin</artifactId>
<version>${fastjson2.version}</version>
</dependency>
```
## 4. 常见问题
## 4.1. ParserConfig.getGlobalInstance().addAccept()如何兼容
在2.x版本中ParserConfig添加autoType白名单的功能在ObjectReaderProvider中提供可以如下的方式配置autoType白名单。
```java
JSONFactory.getDefaultObjectReaderProvider().addAutoTypeAccept("com.mycompany.xxx");
```
## 4.2. ObjectSerializer 和 ObjectDeserializer 被移除了,有什么新的代替方案
FASTJSON v2中有比较完善的扩展机制如下
2022-05-21 17:53:19 +08:00
* Annotation介绍 [https://alibaba.github.io/fastjson2/annotations_cn](https://alibaba.github.io/fastjson2/annotations_cn)
* Annotation注入介绍 [https://alibaba.github.io/fastjson2/mixin_cn](https://alibaba.github.io/fastjson2/mixin_cn)
* Feature介绍 [https://alibaba.github.io/fastjson2/features_cn](https://alibaba.github.io/fastjson2/features_cn)
2022-12-28 21:54:22 +08:00
* 使用Mixin注入Annotation定制序列化和反序列化 [https://alibaba.github.io/fastjson2/mixin_cn](https://alibaba.github.io/fastjson2/mixin_cn)
2022-05-21 17:53:19 +08:00
* 实现ObjectWriter和ObjectReader实现定制序列化和反序列化 [https://alibaba.github.io/fastjson2/register_custom_reader_writer_cn](https://alibaba.github.io/fastjson2/register_custom_reader_writer_cn)
2022-05-21 17:17:26 +08:00
2022-10-05 15:46:45 +08:00
## 4.3. 常见的类扩展升级映射
| fastjson1 | fastjson2 |
|-------------------------------------------------------------|-------------------------------------------------------|
2022-10-05 16:04:15 +08:00
| com.alibaba.fastjson.parser.ParserConfig | com.alibaba.fastjson2.reader.ObjectReaderProvider |
2022-10-05 15:46:45 +08:00
| com.alibaba.fastjson.parser.deserializer.ExtraProcessor | com.alibaba.fastjson2.filter.ExtraProcessor |
| com.alibaba.fastjson.parser.deserializer.ObjectDeserializer | com.alibaba.fastjson2.reader.ObjectReader |
| com.alibaba.fastjson.serializer.AfterFilter | com.alibaba.fastjson2.filter.AfterFilter |
| com.alibaba.fastjson.serializer.BeforeFilter | com.alibaba.fastjson2.filter.BeforeFilter |
| com.alibaba.fastjson.serializer.ContextValueFilter | com.alibaba.fastjson2.filter.ContextValueFilter |
| com.alibaba.fastjson.serializer.LabelFilter | com.alibaba.fastjson2.filter.LabelFilter |
| com.alibaba.fastjson.serializer.NameFilter | com.alibaba.fastjson2.filter.NameFilter |
| com.alibaba.fastjson.serializer.PascalNameFilter | com.alibaba.fastjson2.filter.PascalNameFilter |
| com.alibaba.fastjson.serializer.PropertyFilter | com.alibaba.fastjson2.filter.PropertyFilter |
| com.alibaba.fastjson.serializer.ObjectSerializer | com.alibaba.fastjson2.writer.ObjectWriter |
2022-10-05 16:04:15 +08:00
| com.alibaba.fastjson.serializer.SerializeConfig | com.alibaba.fastjson2.writer.ObjectWriterProvider |
2022-10-05 15:46:45 +08:00
| com.alibaba.fastjson.serializer.ToStringSerializer | com.alibaba.fastjson2.writer.ObjectWriterImplToString |
| com.alibaba.fastjson.serializer.ValueFilter | com.alibaba.fastjson2.filter.ValueFilter |
2022-11-30 16:12:23 +08:00
| com.alibaba.fastjson.serializer.SerializerFeature | com.alibaba.fastjson2.JSONReader.Feature |
| com.alibaba.fastjson.parser.Feature | com.alibaba.fastjson2.JSONWriter.Feature |
2022-10-05 15:46:45 +08:00
2023-03-09 01:15:58 +08:00
## 4.4 SerializerFeature.UseISO8601DateFormat在fastjson2的替代方案
2022-10-05 15:46:45 +08:00
2023-03-09 01:15:58 +08:00
fastjson2的JSONWriter.Feature没有和UseISO8601DateFormat的Feature代替方法是使用format="iso8601",如下:
```java
import com.alibaba.fastjson2.JSON;
String format = "iso8601";
JSON.toJSONString(obj, format);
```
## 4.5 ## SerializerFeature.DisableCircularReferenceDetect在fastjson2的替代方案
在fastjson2中代替的是JSONWriter.Feature.ReferenceDetection但语义相反缺省不一样。fastjson2中的JSONWriter.Feature.ReferenceDetection缺省是关闭的而fastjson1是现实打开的。
## 4.6 SerializerFeature.SortField在fastjson2的替代方案
不需要在fastjson2中JSONObject继承自LinkedHashMap不需要配置这个Feature
## 4.7 SerializerFeature.WriteDateUseDateFormat在fastjson2的替代方案
在fastjson2中的缺省行为就是使用dateFormat如果要修改为成和fastjson 1.x一样的行为需要配置format = "millis",如下:
```java
import com.alibaba.fastjson2.JSON;
String format = "millis";
JSON.toJSONString(obj, format);
```