FastJson 转 Jackson 指南
概述
从 FastJson 迁移到 Jackson 的主要原因包括:
-
安全漏洞
Fastjson 曾多次被发现存在安全漏洞,包括反序列化漏洞、代码执行漏洞、DoS 漏洞等,可能导致数据泄露或系统瘫痪。 -
反序列化性能
虽然 Fastjson 的反序列化性能通常很快,但在处理大量嵌套对象或数组时性能可能下降。 -
JavaBean 规范支持
Fastjson 不完全遵循 JavaBean 规范,而 Jackson 完全支持标准 JavaBean 规范。 -
授权协议
Fastjson 使用 Apache 2.0 协议,对商业应用可能存在一些限制。
代码转换示例
实体类注解转换
Fastjson 使用 @JSONField
,而 Jackson 使用 @JsonProperty
:
public class User {@JsonProperty("user_id") // Jackson 注解private long id;@JsonProperty("user_name") // Jackson 注解private String name;// getter 和 setter 方法
}
序列化/反序列化代码转换
Fastjson 代码:
String json = JSON.toJSONString(user); // 序列化
User user = JSON.parseObject(json, User.class); // 反序列化
转换为 Jackson 代码:
ObjectMapper mapper = new ObjectMapper();// 序列化
String json = mapper.writeValueAsString(user);// 反序列化
User user = mapper.readValue(json, User.class);
常用配置
ObjectMapper mapper = new ObjectMapper();// 常用配置
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性
mapper.setSerializationInclusion(Include.NON_NULL); // 不序列化null值
mapper.enable(SerializationFeature.INDENT_OUTPUT); // 美化输出// 日期格式处理
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
实用工具类示例
public class JsonUtils {private static final ObjectMapper mapper = new ObjectMapper();static {mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);mapper.setSerializationInclusion(Include.NON_NULL);}public static String toJson(Object obj) {try {return mapper.writeValueAsString(obj);} catch (JsonProcessingException e) {throw new RuntimeException("序列化失败", e);}}public static <T> T fromJson(String json, Class<T> clazz) {try {return mapper.readValue(json, clazz);} catch (IOException e) {throw new RuntimeException("反序列化失败", e);}}public static <T> T fromJson(String json, TypeReference<T> typeRef) {try {return mapper.readValue(json, typeRef);} catch (IOException e) {throw new RuntimeException("反序列化失败", e);}}
}
迁移注意事项
-
注解差异:
- Fastjson 的
@JSONField
替换为 Jackson 的@JsonProperty
- Jackson 提供了更多注解如
@JsonIgnore
,@JsonFormat
等
- Fastjson 的
-
日期处理:
- Jackson 需要明确配置日期格式
-
泛型处理:
- 使用
TypeReference
来处理泛型类型
- 使用
-
性能优化:
- 重用
ObjectMapper
实例(线程安全) - 考虑使用
JsonFactory
进行更底层的控制
- 重用
-
异常处理:
- Jackson 抛出 checked exceptions,需要适当处理
通过以上转换,您可以安全地将应用从 Fastjson 迁移到 Jackson,获得更好的安全性和标准兼容性。