JackJson和FastJson

前言:

fastjson是一款强大的json格式转换工具,我个人在开发中就非常喜欢用fastjson;但是由于某些原因,导致fastjson会有一些漏洞,因此在漏洞扫描后需要修复都是要求我们升级版本,或者替换为jackjson;fastjson漏洞提示如下:

1.将 FastJSON 升级到 1.2.83 及以上版本,或noneautotype版本,下载地址:https://repo1.maven.org/maven2/com/alibaba/fastjson/

2.临时修复建议:开启了autoType功能的受影响用户可通过关闭autoType来规避风险,另建议将JDK升级到最新版本。

由于autotype开关的限制可被绕过,请受影响用户升级到FastJSON 1.2.68及以上版本,通过开启safeMode配置完全禁用autoType。三种配置SafeMode的方式如下:

1)在代码中配置: ParserConfig.getGlobalInstance().setSafeMode(true);

2)加上JVM启动参数: -Dfastjson.parser.safeMode=true (如果有多个包名前缀,可用逗号隔开)

3)通过类路径的fastjson.properties文件来配置: fastjson.parser.safeMode=true

因此我这里来做一个fastjson和jackjson的使用方法,和一些对比;

Fastjson vs Jackson

设计方案

fastjson 和 Jackson 这两个库的设计方案存在差异。fastjson 采用的是完全基于注解(Annotation)的方式来标识某个 Java 对象属性是否需要序列化或者反序列化。而 Jackson 则采用了 Mixin 和 PropertyNamingStrategy 这两种技术。

序列化和反序列化

fastjson 和 Jackson 在序列化和反序列化过程中也有细微的区别。fastjson 的序列化和反序列化速度比 Jackson 要快得多。fastjson 可以通过一些配置选项来进一步优化性能,比如关闭循环引用检测、添加类型信息等。相比之下,Jackson 的性能会随着数据规模的增长而呈现出指数级增长。

使用方法

FastJson

1.添加 fastjson 依赖到项目中:
XML 复制代码
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.68</version>
 </dependency>
2.使用示例:
java 复制代码
 public class User {
     @JSONField(name = "username")
     private String username;
     @JSONField(name = "age")
     private int age;
     ...
 }

 // 序列化
 User user = new User();
 user.setUsername("John");
 user.setAge(25);
 String jsonStr = JSON.toJSONString(user);
 System.out.println(jsonStr);

 // 反序列化
 String jsonStr = "{\"username\":\"John\",\"age\":25}";
 User user = JSON.parseObject(jsonStr, User.class);
 System.out.println(user.getUsername() + " " + user.getAge());

JackJson

1.添加 Jackson 依赖到项目中:
XML 复制代码
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.12.5</version>
 </dependency>
2.在类上使用注解即可:
java 复制代码
 class UserMixin {
     @JsonProperty("username")
     private String username;
     @JsonProperty("age")
     private int age;
 }

 public class User {
     private String username;
     private int age;
     ...
 }

 ObjectMapper objectMapper = new ObjectMapper();
 objectMapper.addMixIn(User.class, UserMixin.class);
 objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

 // 序列化
 User user = new User();
 user.setUsername("John");
 user.setAge(25);
 String jsonStr = objectMapper.writeValueAsString(user);
 System.out.println(jsonStr);

 // 反序列化
 String jsonStr = "{\"username\":\"John\",\"age\":25}";
 User user = objectMapper.readValue(jsonStr, User.class);
 System.out.println(user.getUsername() + " " + user.getAge());
3.注意:

如果你想在使用 Jackson 的 ObjectMapper 转换对象为 Map 时,忽略空值字段,可以通过配置 ObjectMapper 的一些特性来实现。

java 复制代码
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Map<String, Object> updateMap = objectMapper.convertValue(dto, Map.class);

在上述代码中,使用 setSerializationInclusion() 方法将属性为 null 的字段排除在转换过程之外。JsonInclude.Include.NON_NULL 表示将属性值为 null 的字段排除。

这样,在转换时,只会包含非空字段的键值对。

总结:

Fastjson 和 Jackson 都是非常好用的 JSON 库,但它们在设计方案、实现方式以及使用方法上存在一些差异。如果你需要一个功能丰富的 JSON 库,同时对性能要求较高,且要求轻便快捷操作简单的话,那么Fastjson 可能更适合你;而如果你更侧重于代码可读性和可维护性,Jackson 可能是更好的选择。无论哪个库,都需要根据具体业务场景和需求来选择。

相关推荐
浮游本尊35 分钟前
Java学习第22天 - 云原生与容器化
java
渣哥2 小时前
原来 Java 里线程安全集合有这么多种
java
间彧2 小时前
Spring Boot集成Spring Security完整指南
java
间彧3 小时前
Spring Secutiy基本原理及工作流程
java
Java水解4 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆6 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学6 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole7 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊7 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端