jackson 是一个用于 java 的高性能 json 处理库,它能够:
- 将 java 对象序列化为 json 格式(对象 → json)
- 将 json 反序列化为 java 对象(json → 对象)
jackson 因其速度快、功能强大且易于使用而成为 java 生态中最流行的 json 处理库之一。
jackson 核心模块
- 1. jackson core:jackson 的核心模块,提供了基本的 json 解析和生成功能。
- 2. jackson annotations:包含各种注解,用于控制序列化和反序列化过程。
- 3. jackson databind:提供数据绑定功能,可以在 java 对象和 json 之间进行转换。
一、基本解析
这是基于 jackson 封装的 json 序列化/反序列化的工具,适用于项目内部的统一处理json,把对象转json字符串、json字符串转回java对象、json转list集合的工具类。
二、封装 objectmapper,全局单例
objectmapper 是 jackson 库的核心工具类,也是 springboot 默认集成的json 解析器。
核心功能:
- 序列化:java 对象 -> json 字符串
- 反序列化:json 字符串 -> java对象
public class jacksonutil {
private jacksonutil() {}
private static final objectmapper object_mapper;
static {
object_mapper = new objectmapper();
}
}三、objectmapper 核心底层原理
3.1 序列化原理(writervalueasstring)方法执行流程:
- objectmapper 拿到 java 对象
- 通过反射读取对象所有字段、getter 方法
- 根据字段类型,转换为对应的 json 数据类型 (字符串、数字、布尔、数组、对象)
- 拼接成标准的 json 字符串返回
- 完全基于反射实现
3.2 反序列化原理(readvalue)方法执行流程:
- 解析 json 字符串, 构建语法树
- 通过反射创建目标 java 对象实例
- 遍历 json 字段,通过 set 方法为对象赋值
- 返回完整 java 对象
四、为什么使用单例的 objectmapper
1.object mapper 创建成本极高
object mapper 内部包含大量:序列化器缓存、反序列化缓存、类型工厂、注解解析器、配置信息
每次 new objectmapper() 都会重新加载所有配置、初始化缓存,非常消耗性能。
2.线程安全
objectmapper 是线程安全的,全局只创建一个实例,多线程并发调用序列化、反序列化完全安全,所以项目中必须单例复用
五、统一异常处理,屏蔽底层的 jackson 异常
- 捕获 jackson 原生 jacksonexception,包装成 spring 的 jsonparseexception 向外抛出
- 非 json 解析异常包装为 illegalstateexception
package com.example.lotterysystem.common.utils;
import org.springframework.boot.json.jsonparseexception;
import org.springframework.util.reflectionutils;
import tools.jackson.core.jacksonexception;
import tools.jackson.databind.javatype;
import tools.jackson.databind.objectmapper;
import java.util.list;
import java.util.concurrent.callable;
public class jacksonutil {
private jacksonutil() {}
private static final objectmapper object_mapper;
static {
object_mapper = new objectmapper();
}
private static objectmapper getobjectmapper() {
return object_mapper;
}
private static <t> t tryparse(callable<t> parser) {
return tryparse(parser, jacksonexception.class);
}
private static <t> t tryparse(callable<t> parser, class<? extends exception> check) {
try {
return parser.call();
}
catch (exception ex) {
if (check.isassignablefrom(ex.getclass())) {
throw new jsonparseexception(ex);
}
throw new illegalstateexception(ex);
}
}
/**
* 序列化方法
* @param object
* @return
*/
public static string writervalueasstring(object object) {
return jacksonutil.tryparse(() -> {
return jacksonutil.getobjectmapper().writevalueasstring(object);
});
}
/**
* 反序列化方法
* @param str
* @param type
* @return
* @param <t>
*/
public static <t> t readvalue(string str, class<t> type) {
return jacksonutil.tryparse(() -> {
return jacksonutil.getobjectmapper().readvalue(str, type);
});
}
/**
* 反序列化list
*/
public static <t> t readlistvalue(string context, class<?> paramclasses) {
javatype javatype = jacksonutil.getobjectmapper().gettypefactory()
.constructparametrictype(list.class, paramclasses);
return jacksonutil.tryparse(() -> {
return jacksonutil.getobjectmapper().readvalue(context, javatype);
});
}
}到此这篇关于java 项目jckson序列化工具详解的文章就介绍到这了,更多相关java jckson序列化工具内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论