浅谈Jackson中@JsonProperty和@JsonAlias注解

浅谈Jackson中@JsonProperty和@JsonAlias注解

这篇文章我们将提供Jackson @JsonProperty和@JsonAlias注解的相关例子:
@JsonProperty,@JsonAlias定义了一个用于Json序列化和反序列化的逻辑属性。
当我们将Json Data转化为Java Object时,我们称之为Json反序列化;而从Java Object得到JSON Data,我们称之为Json的序列化。
下面我们将一步步介绍@JsonProperty和@JsonAlias的具体使用

目录

1.使用到的技术
2.@JsonProperty
3.@JsonProperty Elements

3.1 @JsonProperty value
3.2 @JsonProperty access
4.@JsonProperty with Enum
5.@JsonAlias
6.例子

1.使用到的技术

在我们的例子中将使用到如下技术

  1. Java 9
  2. Jackson 2.9.4
  3. Gradle 4.3.1
  4. Ecplise Oxygen

2.@JsonProperty

@JsonProperty是用于定义逻辑属性的标记注释。@JsonProperty可以注释于静态setter或getter方法或非静态对象字段中。逻辑属性一般被用于JSON的序列化和反序列化。@JsonProperty的使用如下所示:

  1. 用于Object field。
@JsonProperty("bookCategory")
private String category
  1. 用于Getter method
@JsonProperty("bookCategory")
public String getCategory(){
    return category;
}
  1. 用于Setter method
@JsonProperty("bookCategory")
public void setCategory(String category){
    this.category = category;
}

在上述的例子中,逻辑属性是bookCategory。如果我们不对@JsonProperty设任何值,例如

@JsonProperty
private String category;

此时,逻辑属性的name就是实际属性的name,也就是category。

3.@JsonProperty Elements

@JsonProperty的elements如下所示:
value: 定义逻辑属性的名称
access: 更改序列化和反序列化中逻辑属性的可见性
defaultValue: 用于记录预期的默认值
index: 定义与object指定的其他属性相关的属性的数字索引
required: 定义在反序列化期间是否需要属性的值

3.1. @JosnProperty value

value要素定义了逻辑属性的名称

@JsonProperty(value= "bookCategory")	
private String category; 

如果我们仅仅使用value要素,我们可以定义逻辑属性如下:

@JsonProperty("bookCategory")	
private String category; 

3.2. @JsonProperty access

access 要素更改getter或setter或object字段定义的逻辑属性的可见性。
access的值可以是以下之一:
Access.WRITE_ONLY:逻辑属性的可见性仅在我们将JSON数据设置为Java对象时,即在反序列化时才可用。
Access.READ_ONLY:逻辑属性的可见性仅在我们从Java对象获取JSON数据时才可用,即在序列化时。
Access.READ_WRITE:逻辑属性的可见性在序列化和反序列化时都可用。
Access.AUTO:将自动确定逻辑属性的可见性,这是access元素的默认值。

我们像下述例子一样使用它:

@JsonProperty(value= "bookCategory", access=Access.WRITE_ONLY)	
private String category; 

在上述代码中,逻辑属性bookCategory仅在反序列化可用。

4. @JsonProperty with Enum

假设我们已经定义了以下给出的Enum:

public enum Gender {
    @JsonProperty("male") GENDER_MALE,
    @JsonProperty("female") GENDER_FEMALE;
} 

现在,我们使用ObjectMapper序列化上述枚举Enum

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(Gender.GENDER_FEMALE)); 

输出将会是:

"female"

如果我们不使用@JsonProperty,输出将会是:

"GENDER_FEMALE"

5. @JsonAlias

@JsonAlias为反序列化期间接受的属性定义一个或多个备用名称,即将JSON数据设置为Java对象。但是在序列化时,即从Java对象获取JSON时,只使用实际的逻辑属性名而不是别名。@JsonAlias定义如下:

@JsonAlias({"bkcat", "mybkcat"})
private String category; 

在上面的代码中,实际的逻辑属性是category,而别名是bkcat和mybkcat。现在,上面的属性可以从JSON的字段名称bkcat,mybkcat和category中获取值。如果我们使用@JsonProperty定义逻辑属性,@JsonProperty和@JsonAlias可以被用于下述方式:

@JsonProperty("bookCategory")	
@JsonAlias({"bkcat", "mybkcat"})
private String category; 

在上面的代码中,实际的逻辑属性是bookCategory,而别名是bkcat和mybkcat。在反序列化时,JSON是

{ "bookCategory" :"Java" }

或者是

{ "bkcat" :"Java" }

或者JSON是

{ "mybkcat" :"Java" }

以上都将在object属性中设置值category。但当我们进行序列化时,我们将仅使用下面给出的实际逻辑属性名称来获取JSON。

{ "bookCategory" :"Java" }

6.例子

build.gradle

apply plugin: 'java'
apply plugin: 'eclipse'
archivesBaseName = 'concretepage'
version = '1' 
repositories {
    mavenCentral()
}
dependencies {
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.4'
} 

Book.java

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Book {
	@JsonProperty("bookName")		
	private String name;
	
	@JsonProperty("bookCategory")	
	@JsonAlias({"bkcat", "mybkcat"})
	private String category;  
	
  	public Book(){}
  	public Book(String name, String category) {
  		this.name = name;
  		this.category = category;
  	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getCategory() {
		return category;
	}
	public void setCategory(String category) {
		this.category = category;
	}
} 

Writer.java

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Writer {
	@JsonProperty("writerId")	
	private Integer id; 
	
	@JsonProperty("writerName")
	@JsonAlias({"wname", "mywname"})
	private String name;
	
	@JsonProperty("writerBook")	
	private Book book;

  	public Writer(){}
  	public Writer(Integer id, String name, Book book){
  		this.id = id;
  		this.name = name;
  		this.book = book;
  	}	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Book getBook() {
		return book;
	}
	public void setBook(Book book) {
		this.book = book;
	}
} 

JSONToObject.java

import java.io.IOException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JSONToObject {
	public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
		 String jsonData = 
			    "{"
				  +"\"writerId\" : 111,"
				  +"\"mywname\" : \"Mahesh\","
				  +"\"writerBook\" : {"
				    +"\"bookName\" : \"Learning Spring\","
				    +"\"bkcat\" : \"Spring\""
				  +"}"
			   +"}";
		 ObjectMapper mapper = new ObjectMapper();
		 Writer writer = mapper.readValue(jsonData, Writer.class);
		 System.out.println(writer.getId()+", "+ writer.getName());
		 Book book = writer.getBook();
		 System.out.println(book.getName()+", "+ book.getCategory());
	}
} 

Output

111, Mahesh
Learning Spring, Spring 

ObjectToJSON.java

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ObjectToJSON {
  public static void main(String[] args) throws JsonProcessingException {
     ObjectMapper mapper = new ObjectMapper();
     Book book = new Book("Learning Java", "Java");
     Writer writer = new Writer(110, "Mohit", book);
     String jsonWriter = mapper.writerWithDefaultPrettyPrinter()
		 .writeValueAsString(writer);
     System.out.println(jsonWriter);
     
  }
} 

Output

{
  "writerId" : 110,
  "writerName" : "Mohit",
  "writerBook" : {
    "bookName" : "Learning Java",
    "bookCategory" : "Java"
  }
} 

Jackson @JsonProperty and @JsonAlias Example

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值