Jackson2 PropertyFilter用于嵌套属性,还是有另一种方法?
我目前正在寻找一种以多种方式序列化对象而不直接干扰类的方法。 (比如添加大量注释)
想象一下这样的一个类:
class User { String id; String name; String email; ... User manager; }
SimplePropertyFilter
提供了几乎所需的function,但问题是此filter忽略当前对象的级别,并在每个对象上应用所有已定义的filter,无论它是否为嵌套filter。
我不仅限于filter,但我想避免为每个所需的json响应编写多个类。 有没有办法用Jackson2实现这种行为?
如果我们想为编辑表单序列化,我们需要所有字段,但对于用户列表,我们可能只需要其中的一些。
然而,对于经理而言,我们总是只需要“ id
”和id
。 这就是搜索的解决方案。
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生成器(直接)也不知道。
我可以看到使用的最简单的解决方案是在此过滤过程中查找嵌套属性。 这种可能性存在于jackson吗? 可能有其他库支持这种行为?
编辑:我还想补充说我正在使用Spring MVC,可能有一种方法可以通过Spring?
谢谢
用YES和github上的一个小插件库回答我自己的问题。
- 如何忽略Jackson JSON-to-Object映射中的枚举字段?
- Java to Jackson JSON序列化:Money字段
- jackson – 递归解析为Map
- 与JS.fasterxml.jackson JacksonJaxbJsonProvider的@XMLElementWrapper问题
- 在Jackson中映射动态json对象字段?
- 在jackon JSON库中ALLOW_UNQUOTED_FIELD_NAMES
- 泽西岛:如何将jackson添加到Servlet Holder
- Jackson在Spring Boot中错误地序列化了ZonedDateTime
- 创建一个JsonProcessingException