jackson 动态排除序列化字段
分类:软件编程
阅读:71
作者:皇太极
发布:2020-06-05 18:13:56

当我们在使用jackson来完成对象当序列化和反序列化当时候, 只需要在对象上加注解就可以轻松完成

springboot的@ResponseBody默认就是使用jackson来完成对象序列化的.

通过在对象上加注解虽然可以完成字段的过滤和自定义每次等, 但这个是全局但配置,

如果我们的项目在做逻辑处理的时候需要序列化部分字段到db, 而在response返回的时候缺只想返回部分内容, 此时就需要使用动态控制序列化字段手段来完成此功能.

不得不说jackson是真的强大, 相比fastjson最近接连爆出安全漏洞, 这款json操作十分灵活, 社区交流也很活跃.强烈推荐抛弃fastjson,拥抱jackson

业务场景描述:

有一个MyUser对象

  1. public class MyUser {
  2. private String name;
  3. private String nickName;
  4. //@JsonIgnore
  5. private MyBook book;
  6. private MyComputer computer;
  7. }
1 将 MyUser 对象转换成json, 发送给系统A
2 将MyUser 对象返回给客户端B , 但是book字段为隐私数据, 不能给客户端看,需要屏蔽掉

这个场景我们使用注解 @JsonIgnore , 那么系统A收到的数据也是没有 book 内容的,此时全局方案此处是无法胜任的.

解决方案

此时我们可以构建两个json解析对象 (ObjectMapper) , 一个Instance不做特殊处理, 一个Instance排除掉MyBook类型数据

代码示例

  1. public class MyComputer {
  2. private String id;
  3. private int money;
  4. private MyBook book;
  5. }
  1. public class MyBook {
  2. private String name;
  3. private int count;
  4. }

代码省略 get , set 方法

创建自定义注解 @IgnoreSchemaField
  1. @JsonIgnoreType
  2. public @interface IgnoreSchemaField {
  3. }
jackson 配置
  1. ObjectMapper objectMapper = null;
  2. //objectMapper ... 初始化配置
  3. //exclude MyBook
  4. objectMapper.addMixIn(MyBook.class, IgnoreSchemaField.class);
测试代码
  1. @Test
  2. public void serializer(){
  3. MyBook book=new MyBook();
  4. book.setName("java");
  5. book.setCount(2);
  6. MyComputer computer = new MyComputer();
  7. computer.setId("11");
  8. computer.setMoney(23);
  9. computer.setBook(book);
  10. MyUser user = new MyUser();
  11. user.setName("zhangsan");
  12. user.setNickName("zs");
  13. user.setBook(book);
  14. user.setComputer(computer);
  15. ObjectMapper objectMapper = null;
  16. //objectMapper ... 初始化配置
  17. //exclude MyBook
  18. objectMapper.addMixIn(MyBook.class, IgnoreSchemaField.class);
  19. String serialize = objectMapper.writeValueAsString(user);
  20. System.out.println(serialize);
  21. }
验证结果
  1. {
  2. "name" : "zhangsan",
  3. "nick_name" : "zs",
  4. "computer" : {
  5. "id" : "11",
  6. "money" : 23
  7. }
  8. }

如果注释掉 objectMapper.addMixIn(MyBook.class, IgnoreSchemaField.class); 这行代码

  1. {
  2. "name" : "zhangsan",
  3. "nick_name" : "zs",
  4. "book" : {
  5. "name" : "java",
  6. "count" : 2
  7. },
  8. "computer" : {
  9. "id" : "11",
  10. "money" : 23,
  11. "book" : {
  12. "name" : "java",
  13. "count" : 2
  14. }
  15. }
  16. }
  17. Process finished with exit code 0

总结

通过自定义注解, 配置 addMixIn 来完成字段的特殊处理