浅谈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 Elements3.1 @JsonProperty value
3.2 @JsonProperty access
4.@JsonProperty with Enum
5.@JsonAlias
6.例子
1.使用到的技术
在我们的例子中将使用到如下技术
- Java 9
- Jackson 2.9.4
- Gradle 4.3.1
- Ecplise Oxygen
2.@JsonProperty
@JsonProperty是用于定义逻辑属性的标记注释。@JsonProperty可以注释于静态setter或getter方法或非静态对象字段中。逻辑属性一般被用于JSON的序列化和反序列化。@JsonProperty的使用如下所示:
- 用于Object field。
@JsonProperty("bookCategory")
private String category
- 用于Getter method
@JsonProperty("bookCategory")
public String getCategory(){
return category;
}
- 用于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"
}
}