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


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

相关文章推荐

@JsonIgnore作用

@jsonignore的作用 作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。 如下: package com.hzboy.orm; import ja...

json过滤某些属性 之@jsonignore

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

字符串日期比较和时间差 and java时间操作函数汇总

原文: http://yakar.javaeye.com/blog/179171只要格式正确,直接比较字符串就可以了呀,精确到秒的也一样     String   s1   =   "2003-12-...

Fork and Join: Java也可以轻松地编写并发程序

原文地址   作者:Julien Ponge 译者:iDestiny 资源下载: Java SE 7 Sample Code(Zip) 如今,多核处理器在服务器,台式机及笔记本...

【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法

锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,c...

java操作mongo的and,or, in操作

public static void main(String[] args) throws IOException { MechineLog log = new MechineLog(); ...

详解Java的自动装箱与拆箱(Autoboxing and unboxing)

一、什么是自动装箱拆箱 很简单,下面两句代码就可以看到装箱和拆箱过程//自动装箱 Integer total = 99;//自定拆箱 int totalprim = total;简单一点说,装箱就是...

Debugging PL-SQL calls from Java Session Using Eclipse and SQL Developer

参考链接https://blogs.oracle.com/shay/entry/debugging_java_and_plsql_toget

LeetCode 38 Count and Say(C,C++,Java,Python)

Problem: The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 2...

Thread Scheduling and Priority in Java

Thread Scheduling and Priority JVM implements a fixed priority thread-scheduling scheme. Each threa...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】--@JsonIgnore and @JsonProperty
举报原因:
原因补充:

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