Java Jackson |如何序列化指定具体接口的对象
假设我们已经给出了Java接口:Java Jackson |如何序列化指定具体接口的对象,java,json,interface,jackson,polymorphism,Java,Json,Interface,Jackson,Polymorphism,假设我们已经给出了Java接口: public interface UserA { String getLogin(); void setLogin(final String login); } public interface UserB { String getPassword(); void setPassword(final String password); } public interface UserC { String getEmail
public interface UserA {
String getLogin();
void setLogin(final String login);
}
public interface UserB {
String getPassword();
void setPassword(final String password);
}
public interface UserC {
String getEmail();
void setEmail(final String email);
}
以及扩展上述所有功能的接口:
public interface User extends UserA, UserB, UserC {
}
和实现用户界面的类:
public class UserImpl implements User {
// implementation omitted
}
现在,我想序列化UserImpl对象,选择“小”接口(UserA、UserB、UserC)或“大”接口(User)
Exmaples:
- UserA接口的预期结果 {“登录”:“约翰”}
- UserB接口的预期结果 {密码:“JohnSnow”}
- 用户界面的预期结果 {“登录”:“John”,密码:“JohnSnow”,“电子邮件”:john@snow.com“}
ObjectMapper#writer来选择序列化时应使用的接口。下面是显示此功能的通过测试。如果您使用的是旧版本的Jackson,但它没有用于
的writer,那么您可以使用writerWithType
public interface A {
String getStringA();
}
public interface B {
String getStringB();
}
public class AB implements A, B {
@Override
public String getStringA() {
return "value a";
}
@Override
public String getStringB() {
return "value b";
}
}
@Test
public void t() throws JsonProcessingException {
final ObjectMapper mapper = new ObjectMapper();
final String a = mapper.writerFor(A.class).writeValueAsString(new AB());
assertThat(a).isEqualTo("{\"stringA\":\"value a\"}");
final String b = mapper.writerFor(B.class).writeValueAsString(new AB());
assertThat(b).isEqualTo("{\"stringB\":\"value b\"}");
}
不确定你的目标是什么,但是如果你序列化User
,不管怎样,你都会得到这三个接口。若你们只需要一个接口,你们就必须创建单独的类型,每个类型只实现一个接口,并将其序列化。