详解jackson注解(二)jackson反系列化注解
jackson中用于反系列化的主要注解有:
注解 | 描述 | |
---|---|---|
1 | JsonCreator | JsonCreator注解在构造函数或者工厂方法上,用于指示实例化类的对象。构造函数或者工厂方法有多个参数时,参数必须使用JsonProperty或JacksonInject注解。只有一个参数时,可以不加。 |
2 | JsonAlias | @JsonAlias在反序列化时为属性定义一个或多个别名 |
3 | JsonSetter | @JsonSetter是@JsonProperty的替代方法。JsonSetter注解在某个方法上,表明这个方法是setter方法 |
4 | JsonAnySetter | 反系列化时,@JsonAnySetter注解可以灵活地把类型为Map的属性作为标准属性使用。 |
一、JsonCreator
JsonCreator注解在构造函数或者工厂方法上,用于指示实例化类的对象。构造函数或者工厂方法有多个参数时,参数必须使用JsonProperty或JacksonInject注解。只有一个参数时,可以不加。
1、bean
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
public class Linkman implements Serializable {
public int id;
public String name;
public Linkman() {
}
@JsonCreator
// 构造函数或者工厂方法有多个参数时,参数必须使用JsonProperty或JacksonInject注解。
public Linkman(@JsonProperty("linkman_name") String name, @JsonProperty("linkman_id") int id) {
this.name = name;
this.id = id;
}
@JsonCreator
// 构造函数或者工厂方法只有一个参数时,可以不加JsonProperty或JacksonInject注解。
public Linkman(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Linkman{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2、测试
(1)测试多个参数的构造函数:
@Test
public void testJsonCreate() throws JsonProcessingException {
String json = "{\"linkman_id\":100,\"linkman_name\":\"chushiyan\"}";
ObjectMapper mapper = new ObjectMapper();
Linkman linkman = mapper
.readerFor(Linkman.class)
.readValue(json);
System.out.println(linkman);
}
控制台打印:
Linkman{id=100, name='chushiyan'}
(2)测试只有单个参数的构造函数
@Test
public void testJsonCreate2() throws JsonProcessingException {
String json = "{\"linkman_name\":\"chushiyan\"}";
ObjectMapper mapper = new ObjectMapper();
Linkman linkman = mapper
.readerFor(Linkman.class)
.readValue(json);
System.out.println(linkman);
}
控制台打印:
Linkman{id=0, name='chushiyan'}
二、JsonAlias
@JsonAlias在反序列化时为属性定义一个或多个别名。
1、bean
import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;
import java.io.Serializable;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
@Data
public class Customer implements Serializable {
private String id;
// 为name属性定义两个别名
@JsonAlias({ "customer_name", "CustomerName" })
private String name;
}
2、测试
@Test
public void testJsonAlias() throws JsonProcessingException {
String json = "{\"id\":100,\"customer_name\":\"chushiyan\"}";
ObjectMapper mapper = new ObjectMapper();
Customer customer = mapper
.readerFor(Customer.class)
.readValue(json);
System.out.println(customer);
}
控制台打印:
Customer(id=100, name=chushiyan)
三、JsonSetter
@JsonSetter是@JsonProperty的替代方法。JsonSetter注解在某个方法上,表明这个方法是setter方法
1、bean
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;
import java.io.Serializable;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
public class Label implements Serializable {
private String id;
private String name;
@JsonGetter("label_id")
public String getId() {
return id;
}
@JsonSetter("label_id")
public void setId(String id) {
this.id = id;
}
@JsonGetter("label_name")
public String getName() {
return name;
}
@JsonSetter("label_name")
public void setName(String name) {
this.name = name;
}
public Label() {
}
public Label(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Label{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
2、测试
@Test
public void testJsonSetter() throws JsonProcessingException {
Label label = new Label("100", "jackson");
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(label);
System.out.println(json);
Label label2 = mapper
.readerFor(Label.class)
.readValue(json);
System.out.println(label2);
}
控制台打印:
{"label_id":"100","label_name":"jackson"}
Label{id='100', name='jackson'}
四、JsonAnySetter
反系列化时,@JsonAnySetter注解可以灵活地把类型为Map的属性作为标准属性使用。
1、bean
import com.fasterxml.jackson.annotation.JsonAnySetter;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
@Data
public class Book implements Serializable {
private String id;
@JsonAnySetter
private Map<String, String> details = new HashMap<String, String>();
}
2、测试
@Test
public void testJsonAnySetter() throws JsonProcessingException {
String json = "{"
+ "\"id\" : \"100\","
+ "\"author\" : \"chushiyan\","
+ "\"price\" : \"30\","
+ "\"category\" : \"IT\""
+ "}";
ObjectMapper mapper = new ObjectMapper();
Book book = mapper.readValue(json, Book.class);
System.out.println(book);
}
控制台输出:
Book(id=100, details={author=chushiyan, price=30, category=IT})
网友评论