java - 如何使用 Jackson 排除父类(super class)属性

标签 java json jackson

我有一个类:

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

    //getters and setters
}

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

ObjectMapper mapper = new ObjectMapper();
User user = new User;
String jsonString = mapper.writeValueAsString(user);

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

我的父类(super class)有很多这样的公共(public)方法:

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

public final Object method(String name) {
    throw new RuntimeException("Error");
}

最佳答案

<强>1。使用@JsonView注解

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

您需要像这样创建一个描述不同 View 的类:

public class Views {
    public interface Base {}  // view of Base class properties
    public interface Child {} // view of Child class properties (i.e. User)
}

然后用 @JsonView(Views.Base.class) 标记基础 Body 类中的字段/getter:

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

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

    // other getters/setters
}

User 类可以在类级别进行标记:

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

    // getters/setters
}

并且在使用 ObjectMapper 进行序列化时,您将其编写器设置为使用特定 View 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));

输出:

custom view: {"userId":1,"name":"Jack","email":"jack@company.com"}
full   view: {"foo":0,"userId":1,"name":"Jack","email":"jack@company.com","bar":"bar"}

<强>2。使用@JsonIgnoreProperties注解

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

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

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

System.out.println("base class fields ignored: " + mapper.writeValueAsString(user));

输出:

base class fields ignored: {"userId":1,"name":"Jack","email":"jack@company.com"}

<强>3。配置 ObjectMapper 以设置自定义 JacksonAnnotationIntrospector

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

// imports for Jackson v.2.x
// import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
// import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
// imports for Jackson v.1.9
import org.codehaus.jackson.map.introspect.AnnotatedMember;
import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector;

class IgnoreBodyClassIntrospector extends JacksonAnnotationIntrospector {
    @Override
    public boolean hasIgnoreMarker(final AnnotatedMember member) {
        return member.getDeclaringClass() == Body.class || super.hasIgnoreMarker(member);
    }
}

配置 ObjectMapper 并序列化 User 而无需对 BodyUser 进行任何代码更改:

ObjectMapper mapper = new ObjectMapper()
        .setAnnotationIntrospector(new IgnoreBodyClassIntrospector());

User user = new User(3, "Nobody", "nobody@company.com");

System.out.println("no base class fields: " + mapper.writeValueAsString(user));

输出:

no base class fields: {"userId":3,"name":"Nobody","email":"nobody@company.com"}

关于java - 如何使用 Jackson 排除父类(super class)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64098919/

相关文章:

java - 为什么这个文件没有被删除?

java - Tomcat 与 Weblogic JNDI 查找

java - jackson 试图将 json 反序列化为类型对象列表

java - 使用 Jackson 实现 Collection 的类的反序列化失败

java - Java中的Json解析仅通过提供一次键从数组中获取值?

java - green dao 如何使用一次查询四个属性

java - 如何将 "convert"任务 <> 发送到 google.api.services.drive.model.File?

javascript - 如何有效地比较具有不同键但可能匹配值的2个对象?

javascript - 使用 json_encode 将十进制值 php 传递给 javascript

java - 如何在@JsonFormat中使毫秒可选,以便与Jackson进行时间戳解析?