@JSonIgnore注释的等效代码设置是什么? [英] What is equivalent code settings for @JSonIgnore annotation?
问题描述
我是Java
和Jackson
以及其他许多尝试使用的其他技术的新手,所以我希望得到详细的答案.
I'm new to Java
and Jackson
and a lot of other technologies which I try to use, so I'd appreciate a detailed answer.
是否有一种方法可以防止使用Jackson
将一个或多个字段序列化为JSON
类似字符串的格式,但不使用任何类型的JSON
注释?
Is there a way to prevent one or more fields from being serialized using Jackson
into a JSON
String_like format, but without using any kind of JSON
annotations?
类似的东西:mapper.getSerializationConfig().something(ignore("displayname"))
如果您知道我的意思.
我的对象是一个类的实例,该类扩展了另一个类,并且还实现了一个接口,依此类推,因此字段来自类的层次结构.
我需要该对象的JSON
表示形式,但只包含某些字段,因此我可以通过POST
方法在模拟请求中发送该JSON
.
我正在使用Jackson
2.2.2
.
Something like: mapper.getSerializationConfig().something(ignore("displayname"))
if you know what I mean.
My object is an instance of a class that extends another one, and implements one interface also so on, so the fields come from an hierarchy of classes.
I need the JSON
representation for that object but containing only certain fields, so I can send that JSON
in a mock request through a POST
method.
I'm using Jackson
2.2.2
.
推荐答案
如果无法更改类,则可以使用带有@JsonIgnore
批注的方法来创建新的abstract class
/interface
.在此class
/interface
中,您可以定义ObjectMapper
在serialization
/deserialization
过程中应跳过的方法.
If you can't change your classes you can create new abstract class
/interface
with methods with @JsonIgnore
annotation. In this class
/interface
you can define methods which ObjectMapper
should skip during serialization
/deserialization
process.
请参见以下示例:
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonProgram {
public static void main(String[] args) throws IOException {
Person person = new Person();
person.setId(1L);
person.setName("Max");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(Person.class, PersonMixIn.class);
System.out.println(objectMapper.writeValueAsString(person));
}
}
abstract class Entity {
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
interface Namamble {
String getName();
}
class Person extends Entity implements Namamble {
private String name;
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface PersonMixIn {
@JsonIgnore
String getName();
}
编辑-回答评论
您可以创建这样的mixin界面:
You can create such mixin interface:
public static interface UserInformationMixIn {
@JsonIgnore
String getField3();
}
并以这种方式配置ObjectMapper
:
objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class);
在版本2.5
中已弃用方法addMixInAnnotations
,应使用addMixIn
:
In version 2.5
method addMixInAnnotations
was deprecated and addMixIn
should be used:
objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);
完整的示例源代码:
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonProgram {
public static void main(String[] args) throws IOException {
UserInformation userInformation = new UserInformation();
userInformation.setField3("field3");
userInformation.setField4("field4");
userInformation.setField5("field5");
User user = new User();
user.setField1(userInformation);
user.setField2("field2");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);
objectMapper.addMixIn(User.class, UserInformationMixIn.class);
System.out.println(objectMapper.writeValueAsString(user));
}
public static abstract class Someclass {
String field5;
public String getField5() {
return field5;
}
public void setField5(String field5) {
this.field5 = field5;
}
}
public static class UserInformation extends Someclass {
String field3;
String field4;
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(String field4) {
this.field4 = field4;
}
}
public static class User {
UserInformation field1;
String field2;
public UserInformation getField1() {
return field1;
}
public void setField1(UserInformation field1) {
this.field1 = field1;
}
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
}
public static interface UserInformationMixIn {
@JsonIgnore
String getField3();
@JsonIgnore
String getField2();
@JsonIgnore
String getField5();
}
}
有用的链接:
这篇关于@JSonIgnore注释的等效代码设置是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!