假设我们已经给出了 Java 接口(interface):
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);
}
以及扩展上述所有内容的接口(interface):
public interface User extends UserA, UserB, UserC {
}
以及实现用户界面的类:
public class UserImpl implements User {
// implementation omitted
}
现在,我想序列化 UserImpl 对象,选择“小”接口(interface)(UserA、UserB、UserC)或“大”接口(interface)(User)之一。
示例:
UserA 界面的预期结果
{“登录”:“约翰”}
UserB 界面的预期结果
{ 密码:“JohnSnow”}
用户界面的预期结果
{“登录名”:“约翰”,密码:“JohnSnow”,“电子邮件”:“john@snow.com”}
是否有任何方法可以通过将对象的接口(interface)之一传递给 Jackson 映射器来获得上述结果(通过切换接口(interface)更改 JSON)?
最佳答案
使用ObjectMapper#writerFor
选择序列化时应使用哪个接口(interface)。这是显示此功能的通过测试。如果您使用的是没有 writerFor
的旧版 Jackson,那么您可以使用 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\"}");
}
关于 java jackson |如何序列化指定具体接口(interface)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35527657/