我有一个简单的用户类:
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时,它总是被忽略,但我希望有条件忽略。
到目前为止唯一可行的解决方案是拥有两个不同的类。难道就没有更漂亮的解决方案吗?
最佳答案
看看@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
关于java - Jackson:一个类有两种不同的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38698517/