Skip to content

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"

支持的加密脱敏注解

注解功能示例
@EncryptedAESAES 加密123456a1b2c3d4...
@EncryptedRSARSA 加密使用公钥加密
@EncryptedMD5MD5 哈希123456e10adc3949ba59abbe56e057f20f883e
@EncryptedBase64Base64 编码备注5a2X5Liy
@DesensitizePhone手机号脱敏13800138000138****8000
@DesensitizeIdNO身份证脱敏460200199001011234460***********1234
@DesensitizeName姓名脱敏张三丰张*
@DesensitizeEmail邮箱脱敏zhangsan@qq.comzhan***@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);

Power By 数字海南