java jackson |如何序列化指定具体接口(interface)的对象

标签 java json interface jackson polymorphism

假设我们已经给出了 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/

相关文章:

java - 如何制作SeekBar分段,并且每个分段显示不同的颜色?

java - 在 playframework 2.0 中,如何在模板中使用 session 对象?

java - Java中的接口(interface)是什么?

c# - 为什么可以比较不相关的c#接口(interface)引用而不会出现编译错误?

c++ - 公共(public)接口(interface)方法的私有(private)实现

java - 检测未使用的属性键的简单方法?

java - Bufferedwriter 没有将*所有内容*保存到文件中

php - JQuery.ajax 和对象和 php 的空响应

java - 解析复杂的 JSON 文件

python - 将 JSON 数据发送到客户端 django