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 可能是更好的选择。无论哪个库,都需要根据具体业务场景和需求来选择。

相关推荐
guodingdingh7 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯9 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育9 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵9 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影11 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao1213112 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔12 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城13 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience14 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu