跳到主要内容

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 的 ClassJavaTypeTypeReference 指定目标类型:

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 / isJsonArraycanSerialize。这两个工具类名称相近,但依赖和实现边界不同。


← 上一节:ValUtil | 返回文档导航 | 下一节:DateUtil →