【Java】--@JsonIgnore and @JsonProperty

原创 2017年10月08日 19:54:24

【前言】

    最近在做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个点中的任何一个中的应用导致了序列化和反序列化过程完全排除了该属性.


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用@JsonProperty解决无法同时使用@JsonIgnore及@NotNull注解

问题场景用户注册时, 用户需要填写用户名和密码. 使用spring controller来接收请求数据并验证是否. 对于密码字段, 在实体类中我们增加了 @JsonIgnore 使用此注解, 在转...
  • jiangshanwe
  • jiangshanwe
  • 2017年12月19日 18:14
  • 78

JSON使用JsonIgnoreAttribute,ErrorHandlingAttribute,DefaultValueAttribute

一、使用JsonIgnoreAttribute忽略其属性序列化 1.创建一个Movie对象,并在其属性上添加JsonIgnore. using System; using System.Collect...
  • lovegonghui
  • lovegonghui
  • 2015年12月12日 12:02
  • 824

Json注解属性JsonIgnoreProperties,JsonInclude,JsonProperty总结小记

1.JsonIgnoreProperties属性 示例用法:@JsonIgnoreProperties(ignoreUnknown = true) 该注解是放在类名上面,作用是:忽略类中不存在的字...
  • chen_pt
  • chen_pt
  • 2017年08月11日 15:15
  • 690

@JsonProperty的使用

jackson的maven依赖 com.fasterxml.jackson.core jackson-databind 2.5.3 @JsonProperty 此注解用于属性...
  • Paranoia_ZK
  • Paranoia_ZK
  • 2017年04月06日 13:21
  • 9562

fastJson在bean中加入@JsonProperty转换出的对象中依然有字段为null的处理

1.转换的代码如下 String json = "{\"id\":1059827483,\"idstr\":\"1059827483\",\"class\":1,\"screen_name\":\"...
  • lishirong
  • lishirong
  • 2017年03月09日 10:43
  • 2032

json过滤某些属性 之@jsonignore

Jackson相关:使用Jackson相关的注解时一定要注意自己定义的属性命名是否规范。 命名不规范时会失去效果。(例如Ename ,Eage 为不规范命名。“nameE”,“ageE”为规范命名...
  • u012373815
  • u012373815
  • 2016年08月21日 12:18
  • 21669

@JsonIgnore注解的使用

一、jackson的maven依赖 com.fasterxml.jackson.core jackson-databind 2.5.3 二、实体类的建立import com.f...
  • huangbaokang
  • huangbaokang
  • 2017年07月14日 15:05
  • 1076

(10)json字符转 转JavaBean,且bean中还有List<T>属性 ,重点@JsonProperty("tags") [jackson]

public class VideoTagChangeDto { private Long vid; private Long uid; @JsonProperty("msgid") priv...
  • pandajava
  • pandajava
  • 2016年04月01日 11:44
  • 1363

关于双向多对一的@JsonIgnore注解使用方法

@JsonIgnore 注解在 hibernate 中的应用
  • qq12547345
  • qq12547345
  • 2017年09月20日 18:55
  • 262

JSON使用JsonProperty Attribute

一、JSON使用JsonPropertyAttribute重命名属性名 1.先创建一个Movie对象,然后在其属性上添加JsonProperty,并指定重命名的名称。注意:属性Name和Direct...
  • orichisonic
  • orichisonic
  • 2017年05月03日 13:18
  • 676
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】--@JsonIgnore and @JsonProperty
举报原因:
原因补充:

(最多只允许输入30个字)