如何使用 Jackson 排除超类属性

Val*_*y B 3 java json jackson

我有一堂课:

public class User extends Body {
    private Integer userId;
    private String userName;
    private String emailId;

    //getters and setters
}
Run Code Online (Sandbox Code Playgroud)

我想Body用 Jackson 映射器排除类属性,因为我收到错误。

ObjectMapper mapper = new ObjectMapper();
User user = new User;
String jsonString = mapper.writeValueAsString(user);
Run Code Online (Sandbox Code Playgroud)

如何在排除所有扩展或实现类的情况下将对象转换为 JSON?我只需要转换User类而没有Body

我的超类有很多这样的公共方法:

public final Enumeration method(String email) {
    throw new RuntimeException("Error");
}

public final Object method(String name) {
    throw new RuntimeException("Error");
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 5

1. 使用@JsonView注解

Jackson 库具有@JsonView注释,允许提供序列化类的不同视图。

您需要创建一个描述不同视图的类,如下所示:

public class Views {
    public interface Base {}  // view of Base class properties
    public interface Child {} // view of Child class properties (i.e. User)
}
Run Code Online (Sandbox Code Playgroud)

然后你在基Body类中标记字段/getter @JsonView(Views.Base.class)

public class Body {
    @JsonView(Views.Base.class)
    private int foo;

    @JsonView(Views.Base.class)
    public String getBar() {
        return "bar";
    }

    // other getters/setters
}
Run Code Online (Sandbox Code Playgroud)

User类可以被标记在类级别:

@JsonView(Views.Child.class)
public class User extends Body {
    private Integer userId;
    private String userName;
    private String email;

    // getters/setters
}
Run Code Online (Sandbox Code Playgroud)

当序列化时 ObjectMapper您将其编写器设置为使用特定视图writerWithView

ObjectMapper mapper = new ObjectMapper();//

User user = new User(1, "Jack", "jack@company.com");

String json = mapper.writerWithView(Views.Child.class).writeValueAsString(user);

System.out.println("custom view: " + json);  
System.out.println("full   view: " + mapper.writeValueAsString(user));
Run Code Online (Sandbox Code Playgroud)

输出:

custom view: {"userId":1,"name":"Jack","email":"jack@company.com"}
full   view: {"foo":0,"userId":1,"name":"Jack","email":"jack@company.com","bar":"bar"}
Run Code Online (Sandbox Code Playgroud)

2. 使用@JsonIgnoreProperties注解

也可以通过忽略其父类的属性来自定义子类的视图:

custom view: {"userId":1,"name":"Jack","email":"jack@company.com"}
full   view: {"foo":0,"userId":1,"name":"Jack","email":"jack@company.com","bar":"bar"}
Run Code Online (Sandbox Code Playgroud)

那么就不需要配置writer ObjectMapper实例了:

@JsonIgnoreProperties({"foo", "bar"})
public class User extends Body {
    private Integer userId;
    private String name;
    private String email;
}
Run Code Online (Sandbox Code Playgroud)

输出:

base class fields ignored: {"userId":1,"name":"Jack","email":"jack@company.com"}
Run Code Online (Sandbox Code Playgroud)

3.配置 ObjectMapper设置自定义JacksonAnnotationIntrospector

还可以配置ObjectMapper实例以设置自定义注释内省器以完全忽略属于父级的属性Body类的:

System.out.println("base class fields ignored: " + mapper.writeValueAsString(user));
Run Code Online (Sandbox Code Playgroud)

配置ObjectMapper和序列化,User无需对Body和进行任何代码更改User

base class fields ignored: {"userId":1,"name":"Jack","email":"jack@company.com"}
Run Code Online (Sandbox Code Playgroud)

输出:

no base class fields: {"userId":3,"name":"Nobody","email":"nobody@company.com"}
Run Code Online (Sandbox Code Playgroud)