杰克逊属性过滤器用于嵌套属性,还是有其他方法?

时间:2014-10-30 08:34:27

标签: java json spring jackson

我目前正在寻找一种以多种方式序列化对象的方法,而不会直接干扰这些类。 (比如添加大量注释)

想象一下这样的课程:

class User {
  String id;
  String name;
  String email;
  ...
  User manager;
}

SimplePropertyFilter提供了几乎所需的功能,但问题是此过滤器会忽略当前对象的级别,并在每个对象上应用所有已定义的过滤器,无论它是否为嵌套过滤器。

我不仅限于过滤器,但我想避免为每个所需的json响应编写多个类。有没有办法用Jackson2实现这种行为?


如果我们想要为编辑表单序列化,我们需要所有字段,但对于用户列表,我们可能只需要其中一些。

对于经理而言,我们总是需要"只有" idname。这就是搜索解决方案的原因。

JSON输出应该是这样的:

{
  "id" : "20",
  "login" : "USER20",
  "name" : "User 20",
  "email" : "user20@no.where",
  "manager" : {
     "id" : "1",
     "name" : "Administrator"
  }
}

我觉得属性过滤方法让我非常接近所需的解决方案,但从我发现的只能定义"简单"属性。

public class UserJsonWriter {
  public String toJson() {
    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id", "login", "name", "email", "manager");
    // Unfortunatly I cannot write:
    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("id", "login", "name", "email", "manager.id", "manager.name");


    User user = userService.getUser(20);
    ObjectMapper copy = objectMapperFactoryBean.getCopy();
    copy.addMixInAnnotations(User.class, CustomFilter.class);
    ObjectWriter writer = copy.writer(new SimpleFilterProvider().addFilter("customFilter", filter));
    return writer.writeValueAsString(user);
  }
}

@JsonFilter("customFilter")
public class CustomFilter {

}

目前输出看起来像这样。

{
  "id" : "20",
  "login" : "USER20",
  "name" : "User 20",
  "email" : "user20@no.where",
  "manager" : {
     "id" : "1",
     "login" : "ADMIN",
     "name" : "Administrator",
     "email" : "admin@no.where",
     "manager" : {
       ... (might continue multiple times)
     }
   }
}

据我所知,PropertyFilter不知道当前的位置"序列化,json生成器(直接)。

我可以看到使用的最简单的解决方案是在此过滤过程中查找嵌套属性。杰克逊有这种可能吗?可能还有其他库支持这种行为吗?

编辑:我还想补充一点,我使用Spring MVC,可能有一种方法可以通过Spring吗?

由于

1 个答案:

答案 0 :(得分:1)

使用YES和github上的一个小插件库回答我自己的问题。

https://github.com/Antibrumm/jackson-antpathfilter