SpringBoot @JsonDeserialize自定義Json序列化方式

@JsonDeserialize自定義Json序列化

1.問題

在項目上使用SpringBoot為框架,調用第三方接口時,返回的參數Date類型,需要自定義進行Json序列化,需要進行處理,接受數據

2.現象

調用第三方接口,返回參數類型為Date類型,格式如下:

{
    "created": "2018-12-27 16:15:25",
    "lastupd": "2018-12-27 08:25:48"
}

返回Date類型數據格式為:yyyy-MM-dd HH:mm:ss,Json默認序列化Date類型參數,格式為:yyyy-MM-dd HH:mm:ss.SSS,則需要自定義進行系列化

3.解決辦法

創建接收數據對象,生成Get\Set方法:,在Set方法上,加上@JsonDeserialize註解,如下:

 public class TestDto implements Serializable {   
    /**
     * 生成時間
     *
     */
    private Date created;
    /**
     * LastUpd
     *
     */
    private Date lastUpd;
​
    public Date getCreated() {
        return created;
    }
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)
    public void setCreated(Date created) {
        this.created = created;
    }
    public Date getLastUpd() {
        return lastUpd;
    }
    @JsonDeserialize(using = CustomJsonDateDeserializer.class)
    public void setLastUpd(Date lastUpd) {
        this.lastUpd = lastUpd;
    }
 }

在進行自定義序列化時,加上 @JsonDeserialize(using = CustomJsonDateDeserializer.class)註解,

其中@JsonDeserialize,表示告訴SpringBoot,當前屬性進行自定義系列化,則SpringBoot進行序列化時,將會跳過這個參數

CustomJsonDateDeserializer.class為自定義序列化對象,如下:

package com.test;​
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
​
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**
 * 自定義序列化
 **/
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
​
    @Override
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = jp.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

以上,接受數據時,會自定義進行Json序列化,接收Date格式的數據。

@JsonSerialize與@JsonDeserialize使用

1.以註解方式使用

@JsonDeserialize(using= DateJsonDeserializer.class)
@JsonSerialize(using= DateJsonSerializer.class)
private Date time;

2.自定義實現類

public class DateJsonDeserializer extends JsonDeserializer<Date>
{
    public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    @Override
    public Date deserialize(com.fasterxml.jackson.core.JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, com.fasterxml.jackson.core.JsonProcessingException {
 
        try
        {
            if(jsonParser!=null&&StringUtils.isNotEmpty(jsonParser.getText())){
                return format.parse(jsonParser.getText());
            }else {
                return null;
            }
 
        }
        catch(Exception e)
        {
            System.out.println(e.getMessage());
            throw new RuntimeException(e);
        }
    }
}
public class DateJsonSerializer extends JsonSerializer<Date> {
    public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(format.format(date));
    }

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: