java - 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", "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/

相关文章:

java - 如何将 build.xml 中定义的变量值传递给 Java 类

Java 复制构造函数

javascript - 在Karate框架中的RunnerTest.have中编写javascript公共(public)函数

Java开始读取具有给定起始对象的Json

javascript - 从json文件中读取ip地址并将其作为标签放置在div中

java - 当我在 Spring Boot 的 POST API 中使用对象列表时出现 ClassCastException

java - 如何在Matlab中处理来自XML-RPC的hashmap中的[Ljava.lang.object?

java - GWT 使用异步回调进行同步/阻塞调用

java - 用于 Jackson json 转换的良好内置数据结构是什么?

java - 为什么 Jackson 反序列化 json 无法按顺序打印对象数组?