Jackson2 PropertyFilter用于嵌套属性,还是还有另一种方法?

Mar*_*rey 5 java spring json jackson

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

想象一个这样的类:

class User {
  String id;
  String name;
  String email;
  ...
  User manager;
}
Run Code Online (Sandbox Code Playgroud)

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

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


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

但是对于经理,我们总是需要“仅” id和name。这就是寻找解决方案的地方。

JSON输出应如下所示:

{
  "id" : "20",
  "login" : "USER20",
  "name" : "User 20",
  "email" : "user20@no.where",
  "manager" : {
     "id" : "1",
     "name" : "Administrator"
  }
}
Run Code Online (Sandbox Code Playgroud)

我觉得属性过滤器方法使我非常接近所需的解决方案,但是从我发现的结果来看,您只能定义“简单”属性。

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 {

}
Run Code Online (Sandbox Code Playgroud)

当前输出看起来像这样。

{
  "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)
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢

Mar*_*rey 3

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

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