Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson:一个类有两种不同的表示形式_Java_Json_Jackson - Fatal编程技术网

Java Jackson:一个类有两种不同的表示形式

Java Jackson:一个类有两种不同的表示形式,java,json,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", "someCommonDa

我有一个简单的用户类:

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时,它总是被忽略,但我希望有条件忽略


到目前为止,唯一可行的解决方案是使用两个不同的类。难道没有更好的解决方案吗?

我能想出的最好、最简单的办法就是使用两个类。很抱歉 但在我看来,当你这样做时,它看起来是一个更好的设计:

public class User {
    private long id;
    private String username;
    private String password;
    private String someCommonData;
}

public class Admin extends User {
    private String someAdminData;
}

看看
@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"
}

本博客介绍了基本知识:

我认为应该help@Prasad:Thx但该问题包括基于其值而非用例的字段。在某些情况下,我同意这可能是更干净的解决方案。但是当类变大时,你必须维护一个更大的代码库,这是我想要避免的。这与我搜索的非常接近。唯一不太好的一点是,使用JsonView迫使我注释类的所有字段。我没有找到包含没有JsonView注释的字段的内容。要包含未注释的字段,必须启用默认的\u视图\u包含。在Spring Boot/MVC应用程序中,只需将
Spring.jackson.mapper.default view inclusion=true
添加到application.properties。