Java Jackson:一个类有两种不同的表示形式
我有一个简单的用户类:Java Jackson:一个类有两种不同的表示形式,java,json,jackson,Java,Json,Jackson,我有一个简单的用户类: public class User { private long id; private String username; private String password; private String someCommonData; private String someAdminData; } 我希望该用户在json中有不同的表示。 适用于普通用户的版本: {"username":"myName", "someCommonDa
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时,它总是被忽略,但我希望有条件忽略
到目前为止,唯一可行的解决方案是使用两个不同的类。难道没有更好的解决方案吗?我能想出的最好、最简单的办法就是使用两个类。很抱歉 但在我看来,当你这样做时,它看起来是一个更好的设计:
public class User {
private long id;
private String username;
private String password;
private String someCommonData;
}
public class Admin extends User {
private String someAdminData;
}
看看
@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"
}
本博客介绍了基本知识:我认为应该help@Prasad:Thx但该问题包括基于其值而非用例的字段。在某些情况下,我同意这可能是更干净的解决方案。但是当类变大时,你必须维护一个更大的代码库,这是我想要避免的。这与我搜索的非常接近。唯一不太好的一点是,使用JsonView迫使我注释类的所有字段。我没有找到包含没有JsonView注释的字段的内容。要包含未注释的字段,必须启用默认的\u视图\u包含。在Spring Boot/MVC应用程序中,只需将
Spring.jackson.mapper.default view inclusion=true
添加到application.properties。