2016-08-01 94 views
1

的2点不同的表示我有一个简单的用户等级:杰克逊:具有类

public class User { 
    private long id; 
    private String username; 
    private String password; 
    private String someCommonData; 
    private String someAdminData; 
} 

我想有一个JSON用户的不同表示。 对于普通用户来说一个版本:

{"username":"myName", "someCommonData":"bla"} 

和adminUsers表示:

{"id":1, "username":"myName", "someCommonData":"bla", "someAdminData":"don't show this to the user!"} 

当我使用@JsonIgnore那么它总是被忽略,但我想有有条件忽略。

到目前为止工作的唯一解决方案是拥有两个不同的类。没有更美丽的解决方案吗?

+0

我认为[this](http://stackoverflow.com/a/19275010/1025 328)应该帮助 –

+0

@Prasad:Thx,但是这个问题涵盖了基于它的值而不是用例的字段。 – Packo

回答

1

看看@JsonView

public class User { 
    @JsonView({Admin.class}) 
    private long id; 

    @JsonView({Basic.class}) 
    private String username; 

    @JsonIgnore 
    private String password; 

    @JsonView({Basic.class}) 
    private String someCommonData; 

    @JsonView({Admin.class}) 
    private String someAdminData; 

    static class Basic { 
    } 

    static class Admin extends Basic { 
    } 

    public static void main(String[] args) throws JsonProcessingException { 
     ObjectMapper mapper = new ObjectMapper(); 


     User user = new User(); 
     user.id = 1L; 
     user.username = "admin"; 
     user.password = "nimda"; 
     user.someCommonData = "common-data"; 
     user.someAdminData = "admin-data"; 

     ObjectWriter writer = mapper.writerWithDefaultPrettyPrinter(); 

     System.out.println(writer.withView(Basic.class).writeValueAsString(user)); 
     System.out.println(writer.withView(Admin.class).writeValueAsString(user)); 
    } 
} 

输出的主:

{ 
    "username" : "admin", 
    "someCommonData" : "common-data" 
} 
{ 
    "id" : 1, 
    "username" : "admin", 
    "someCommonData" : "common-data", 
    "someAdminData" : "admin-data" 
} 

这个博客介绍的基础知识:http://www.baeldung.com/jackson-json-view-annotation

+0

这非常接近我正在寻找的东西。只有这一点不是很好,因为使用JsonView迫使我注释该类的所有字段。我还没有找到包含没有JsonView注释的字段的东西。 – Packo

+0

要包含未注释的字段,您必须启用DEFAULT_VIEW_INCLUSION。在Spring Boot/MVC应用程序中,只需在你的application.properties中添加'spring.jackson.mapper.default-view-inclusion = true'。 – Packo

0

我能想出的最好和最轻松的方法是使用两个类别。抱歉。 但它看起来对我来说是一个更好的设计,当你这样做:

public class User { 
    private long id; 
    private String username; 
    private String password; 
    private String someCommonData; 
} 

public class Admin extends User { 
    private String someAdminData; 
} 
+0

在某些情况下,我确实同意这可能是更干净的解决方案。但是当班级变大时,你必须维护一个我想避免的更大的代码库。 – Packo