【前言】
最近在做Java的项目,用到了很多Java自带的注解,小编也不是很理解,所以查了一些相关资料,现在开始总结一下其中的@jsonIgnore和@JsonProperty.
【正文】
当您想从JSON序列化和反序列化过程中排除某些类成员时,Jackson有两种不同的注释。这两个注释是@JsonIgnore和@JsonIgnoreProperties。
@JsonIgnoreProperties是类级别的注释,它希望排除的属性将以字符串列表的形式明确指出。
@JsonIgnore是一个成员级别或方法级的注释,它需要逐个标记要排除的属性。为了完全排除成员从序列化和反序列化的过程,可以注释实际的属性或其设置者或其吸气剂。(此行为自Jackson的1.9版本开始生效)。也可以在序列化和反序列化之间以不对称的方式排除属性.
现在我们来看一下使用这些注释的具体例子。我们创建一个类MyTestClass,其中包含一些属性和相关的getter和setter以及一个简单的测试类,我们在其中创建该类的对象,然后执行其JSON序列化和反序列化。
我们从一个使用类的例子开始,没有排除某些属性的注释。
import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
class MyTestClass {
private long id;
private String name;
private String notInterstingMember;
private int anotherMember;
private int forgetThisField;
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getNotInterstingMember() {
return this.notInterstingMember;
}
public void setNotInterstingMember(String notInterstingMember) {
this.notInterstingMember = notInterstingMember;
}
public int getAnotherMember() {
return this.anotherMember;
}
public void setAnotherMember(int anotherMember) {
this.anotherMember = anotherMember;
}
public int getForgetThisField() {
return this.forgetThisField;
}
public void setForgetThisField(int forgetThisField) {
this.forgetThisField = forgetThisField;
}
@Override
public String toString() {
return "MyTestClass [" + this.id + " , " + this.name + ", " + this.notInterstingMember + ", " + this.anotherMember + ", " + this.forgetThisField + "]";
}
}
public class JSONIgnorePropTest {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper();
MyTestClass mtc = new MyTestClass();
mtc.setId(1);
mtc.setName("Test program");
mtc.setNotInterstingMember("Don't care about this");
mtc.setAnotherMember(100);
mtc.setForgetThisField(-1);
String s = null;
try {
s = mapper.writeValueAsString(mtc);
}
catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(s);
MyTestClass mtc2 = null;
try {
mtc2 = mapper.readValue(s, MyTestClass.class);
}
catch (JsonParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(mtc2.toString());
}
}
第一次运行的结果如下,其中所有的字段及其值都被序列化,然后在反序列化过程中被重构。
{"id":1,"name":"Test program","notInterstingMember":"Don't care about this","anotherMember":100,"forgetThisField":-1}
MyTestClass [1 , Test program, Don't care about this, 100, -1]
现在假设你想从序列化和反序列化的结果中排除一些类MyTestClass属性,例如“notInterstingMember”和“forgetThisField”属性。作为第一种情况,我们看到如何通过@JsonIgnoreProperties注释来实现这一点。为此,我们必须更改MyTestClass类,如下所示:
@JsonIgnoreProperties({"notInterstingMember", "forgetThisField"}) class MyTestClass { private long id; private String name; private String notInterstingMember; private int anotherMember; private int forgetThisField; // REST OF THE CODE... }
通过再次运行程序,这次我们得到以下结果:
"id":1,"name":"Test program","anotherMember":100} MyTestClass [1 , Test program, null, 100, 0]
我们可以看到,在序列化过程生成的字符串中不存在我们通过注释排除的属性值。因此,反序列化后,这些属性将采用由其类型提供的默认值,对于String属性则为“null”,对于int属性为0。
使用其他注释@JsonIgnore也可以获得相同的结果,如上所述,它不是“类级”注释,而是“成员级”或“方法级”。我们再次改变我们的示例类,如下所示:
通过再次运行程序,我们可以看到结果与前一种情况相同。class MyTestClass { private long id; private String name; @JsonIgnore private String notInterstingMember; private int anotherMember; @JsonIgnore private int forgetThisField; // REST OF THE CODE }
{"id":1,"name":"Test program","anotherMember":100} MyTestClass [1 , Test program, null, 100, 0]
【总结】要使用@JsonIgnore注释来完成这个结果,它可以直接放在实例成员或者其getter或者它的setter上。注释在这3个点中的任何一个中的应用导致了序列化和反序列化过程完全排除了该属性.