详解jackson注解(二)jackson反系列化注解

详解jackson注解(二)jackson反系列化注解

jackson中用于反系列化的主要注解有:

注解描述
1JsonCreatorJsonCreator注解在构造函数或者工厂方法上,用于指示实例化类的对象。构造函数或者工厂方法有多个参数时,参数必须使用JsonProperty或JacksonInject注解。只有一个参数时,可以不加。
2JsonAlias@JsonAlias在反序列化时为属性定义一个或多个别名
3JsonSetter@JsonSetter是@JsonProperty的替代方法。JsonSetter注解在某个方法上,表明这个方法是setter方法
4JsonAnySetter反系列化时,@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})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值