我有一个类:
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
而无需对 Body
和 User
进行任何代码更改:
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/