主题
JacksonUtils JSON序列化工具
cn.com.digitalhainan.tools.jackson.JacksonMapper
核心 Mapper 实例
JacksonMapper 提供了多个预定义的静态实例,适用于不同场景:
| 实例 | 说明 |
|---|---|
alwaysMapper | 输出所有属性(包括 null) |
nonNullMapper | 只输出非 null 的属性 |
nonEmptyMapper | 只输出非 null 且非空的属性 |
nonDefaultMapper | 只输出非默认值的属性 |
snakeDefaultMapper | 属性名转为下划线格式 |
encryptionMapper | 支持加密脱敏注解 |
基本序列化和反序列化
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
// 定义实体类
public class User {
private String name;
private Integer age;
private String email;
// getter/setter...
}
// 对象转JSON(使用 alwaysMapper,输出所有属性)
User user = new User();
user.setName("张三");
user.setAge(25);
// email 为 null
String json = JacksonMapper.alwaysMapper.toJson(user);
// 输出:{"name":"张三","age":25,"email":null}
// JSON转对象
User parsedUser = JacksonMapper.alwaysMapper.fromJson(json, User.class);不同 Mapper 的输出对比
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
import java.util.Arrays;
import java.util.Collections;
public class User {
private String name = "张三";
private Integer age = 25;
private String email = null; // null 值
private List<String> tags = Collections.emptyList(); // 空集合
private List<String> roles = Arrays.asList("admin"); // 非空集合
// getter/setter...
}
User user = new User();
// alwaysMapper - 输出所有属性
String alwaysJson = JacksonMapper.alwaysMapper.toJson(user);
// 输出:{"name":"张三","age":25,"email":null,"tags":[],"roles":["admin"]}
// nonNullMapper - 忽略 null 属性
String nonNullJson = JacksonMapper.nonNullMapper.toJson(user);
// 输出:{"name":"张三","age":25,"tags":[],"roles":["admin"]}
// nonEmptyMapper - 忽略 null 和空集合
String nonEmptyJson = JacksonMapper.nonEmptyMapper.toJson(user);
// 输出:{"name":"张三","age":25,"roles":["admin"]}
// snakeDefaultMapper - 驼峰转下划线
String snakeJson = JacksonMapper.snakeDefaultMapper.toJson(user);
// 输出:{"name":"张三","age":25,"email":null,"tags":[],"roles":["admin"]}
// 注意:属性名 userName -> user_name集合与 Map 处理
List 序列化与反序列化
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.List;
// List 序列化
List<User> users = Arrays.asList(user1, user2);
String jsonArray = JacksonMapper.alwaysMapper.toJson(users);
// 输出:[{"name":"张三","age":25},{"name":"李四","age":30}]
// List 反序列化(使用 TypeReference)
List<User> userList = JacksonMapper.alwaysMapper.fromJson(jsonArray,
new TypeReference<List<User>>() {});
// 或使用 createCollectionType 构造类型
JavaType listType = JacksonMapper.alwaysMapper.createCollectionType(
List.class, User.class);
List<User> userList2 = JacksonMapper.alwaysMapper.fromJson(jsonArray, listType);Map 序列化与反序列化
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.Map;
import java.util.HashMap;
// Map 序列化
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("message", "成功");
result.put("data", user);
String mapJson = JacksonMapper.alwaysMapper.toJson(result);
// 输出:{"code":200,"message":"成功","data":{"name":"张三","age":25}}
// Map 反序列化
Map<String, Object> parsedMap = JacksonMapper.alwaysMapper.fromJson(mapJson,
new TypeReference<Map<String, Object>>() {});
Integer code = (Integer) parsedMap.get("code"); // 200
String message = (String) parsedMap.get("message"); // "成功"使用注解进行加密与脱敏
定义带注解的实体类
java
import cn.com.digitalhainan.tools.jackson.annotation.*;
public class SecureUser {
private String name;
@DesensitizePhone // 手机号脱敏:13800138000 -> 138****8000
private String phone;
@DesensitizeIdNO // 身份证脱敏:460200199001011234 -> 460***********1234
private String idNo;
@DesensitizeName // 姓名脱敏:张三 -> 张*
private String realName;
@DesensitizeEmail // 邮箱脱敏:zhangsan@qq.com -> zhan***@qq.com
private String email;
@EncryptedAES // AES 加密
private String password;
@EncryptedBase64 // Base64 编码
private String remark;
// getter/setter...
}序列化示例(使用 encryptionMapper)
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
SecureUser user = new SecureUser();
user.setName("张三");
user.setPhone("13800138000");
user.setIdNo("460200199001011234");
user.setRealName("张三丰");
user.setEmail("zhangsan@qq.com");
user.setPassword("123456");
user.setRemark("备注信息");
// 使用 encryptionMapper 进行加密脱敏序列化
String json = JacksonMapper.encryptionMapper.toJson(user);
// 输出示例:
// {
// "name": "张三",
// "phone": "138****8000",
// "idNo": "460***********1234",
// "realName": "张*",
// "email": "zhan***@qq.com",
// "password": "a1b2c3d4e5f6...", // AES 加密后的密文
// "remark": "5a2X5Liy5L+h5oGv" // Base64 编码
// }反序列化示例
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
// 加密字段在反序列化时会自动解密
String json = "{\"name\":\"张三\",\"password\":\"a1b2c3d4e5f6...\"}";
SecureUser user = JacksonMapper.encryptionMapper.fromJson(json, SecureUser.class);
// user.getPassword() 会自动解密为原始值 "123456"支持的加密脱敏注解
| 注解 | 功能 | 示例 |
|---|---|---|
@EncryptedAES | AES 加密 | 123456 → a1b2c3d4... |
@EncryptedRSA | RSA 加密 | 使用公钥加密 |
@EncryptedMD5 | MD5 哈希 | 123456 → e10adc3949ba59abbe56e057f20f883e |
@EncryptedBase64 | Base64 编码 | 备注 → 5a2X5Liy |
@DesensitizePhone | 手机号脱敏 | 13800138000 → 138****8000 |
@DesensitizeIdNO | 身份证脱敏 | 460200199001011234 → 460***********1234 |
@DesensitizeName | 姓名脱敏 | 张三丰 → 张* |
@DesensitizeEmail | 邮箱脱敏 | zhangsan@qq.com → zhan***@qq.com |
高级用法
美化输出 JSON
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
User user = new User();
user.setName("张三");
user.setAge(25);
// 格式化输出(带缩进)
String prettyJson = JacksonMapper.alwaysMapper.beautifyJson(user);
// 输出:
// {
// "name" : "张三",
// "age" : 25
// }更新对象属性
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
User user = new User();
user.setName("张三");
user.setAge(25);
// 用 JSON 更新对象的部分属性
String updateJson = "{\"age\":30,\"email\":\"zhangsan@example.com\"}";
User updatedUser = JacksonMapper.alwaysMapper.update(updateJson, user);
// 结果:name="张三", age=30, email="zhangsan@example.com"操作 JsonNode
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
// 创建 ObjectNode
ObjectNode root = JacksonMapper.alwaysMapper.createObjectNode();
root.put("code", 200);
root.put("message", "成功");
// 添加嵌套对象
ObjectNode data = root.putObject("data");
data.put("name", "张三");
data.put("age", 25);
// 创建 ArrayNode
ArrayNode items = root.putArray("items");
items.add("item1");
items.add("item2");
String json = JacksonMapper.alwaysMapper.toJson(root);
// 解析为 JsonNode
JsonNode parsedNode = JacksonMapper.alwaysMapper.readTree(json);
String message = parsedNode.get("message").asText(); // "成功"
int code = parsedNode.get("code").asInt(); // 200自定义 ObjectMapper
java
import cn.com.digitalhainan.tools.jackson.JacksonMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
// 创建自定义配置的 ObjectMapper
ObjectMapper customMapper = JacksonMapper.createCustomMapper();
// 可以进一步自定义配置
customMapper.setDateFormat(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"));
// 包装为 JacksonMapper 使用
JacksonMapper mapper = new JacksonMapper();
mapper.setMapper(customMapper);