2014-10-30 30 views
4

我目前正在寻找一种方法来以多种方式序列化一个对象,而不会直接干扰这些类。 (如添加大量的注释)Jackson2 PropertyFilter的嵌套属性,还是有另一种方式?

想像这样的一类:

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

SimplePropertyFilter提供几乎所期望的功能,但问题是,这种过滤器将忽略当前对象的水平和应用所有定义的过滤器在每个对象上,它是否是嵌套的。

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


如果我们想序列化此为我们所需要的所有字段的编辑形式,但对于用户的列表,我们可能只需要其中的一部分。

对于经理,但我们总是需要“仅”idname。这就是搜索解决方案的原因。

的JSON输出应该成为这样的事情:

{ 
    "id" : "20", 
    "login" : "USER20", 
    "name" : "User 20", 
    "email" : "[email protected]", 
    "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" : "[email protected]", 
    "manager" : { 
    "id" : "1", 
    "login" : "ADMIN", 
    "name" : "Administrator", 
    "email" : "[email protected]", 
    "manager" : { 
     ... (might continue multiple times) 
    } 
    } 
} 

从我所知道的,PropertyFilter不知道该序列的当前“位置”,同样没有JSON的发电机(直接)。

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

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

谢谢

回答

相关问题