JacksonUtil - Jackson 插件 JSON 处理
JacksonUtil 位于可选模块 dlz-json-jackson(包名 com.dlz.kit.json.jackson),用于在项目已经使用 Jackson 时进行序列化、反序列化、树模型和对象转换。核心模块的内置 JSON 能力请使用 JsonUtil,不要为使用 JSONMap 单独引入 Jackson。
依赖
<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-json-jackson</artifactId>
<version>6.7.4</version>
</dependency>
序列化
String json = JacksonUtil.getJson(value);
byte[] bytes = JacksonUtil.toJsonAsBytes(value); // UTF-8
序列化失败时抛出 IllegalArgumentException,原始 Jackson 异常作为 cause 保留。
反序列化
JSONMap map = JacksonUtil.readValue(json);
User user = JacksonUtil.readValue(json, User.class);
List<User> users = JacksonUtil.readListValue(json, User.class);
JSONList list = JacksonUtil.readList(json);
支持使用 Jackson 的 Class、JavaType 或 TypeReference 指定目标类型:
User user = JacksonUtil.readValue(json, User.class);
List<User> users = JacksonUtil.readValue(json,
new TypeReference<List<User>>() {});
当前工具类的 readValue 输入参数是 String。需要从流、文件或 URL 读取时,请先由调用方读取内容,或直接使用 JacksonUtil.getInstance() 返回的 ObjectMapper。
树模型
JsonNode tree = JacksonUtil.readTree(json);
JsonNode valueTree = JacksonUtil.valueToTree(value);
User user = JacksonUtil.treeToValue(tree, User.class);
树解析或树转换失败时抛出 IllegalArgumentException。
对象转换
User user = JacksonUtil.convertValue(map, User.class);
JSONMap map = JacksonUtil.convertValue(user, JSONMap.class);
// 字符串输入按 JSON 读取;已是目标类型的值直接返回
User same = JacksonUtil.coverObj(value, User.class);
coverObj 接收到 null 时返回 null;字符串输入按 JSON 内容解析,其他值交给 Jackson convertValue 处理。
JavaType 构建
JavaType userListType = JacksonUtil.mkJavaType(List.class, User.class);
JavaType customType = JacksonUtil.mkJavaType(existingType);
mkJavaType 支持无参数类型、参数化类型和任意 Java Type。需要复杂泛型时,也可以直接使用 Jackson 的 TypeReference。
ObjectMapper
ObjectMapper mapper = JacksonUtil.getInstance();
工具类使用一个共享的 ObjectMapper。当前配置包括:允许单引号和无引号字段名、忽略未知属性、非空字段序列化、默认日期格式 yyyy-MM-dd HH:mm:ss,以及 Java 时间类型模块。
不要在业务代码中修改共享 ObjectMapper 的全局配置;若需要完全独立的配置,请自行创建 ObjectMapper。
与核心 JsonUtil 的边界
以下能力属于核心模块 JsonUtil,不属于 JacksonUtil:路径取值 at、路径拆分 splitKey、JSON 文本类型判断 isJsonObj / isJsonArray 和 canSerialize。这两个工具类名称相近,但依赖和实现边界不同。