1. 程式人生 > 程式設計 >SpringBoot @JsonDeserialize自定義Json序列化方式

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

目錄
  • @onDeserialize自定義Json序列化
    • 1.問題
    • 2.現象
    • 3.解決辦法
  • @JsonSerialize與@JsonDeserialize使用
    • 1.以註解方式使用
    • 2.自定義實現類

@JsonDeserialize自定義Json序列化

1http://www.cppcns.com.問題

在專案上使用SpringBoot為框架,呼叫第三方介面時,返回的引數Date型別,需要自定義進行Json序列化,需要進行處理,接受資料

2.現象

呼叫第三方介面,返回引數型別為Date型別,格式如下:

{
    "created": "2018-12-27 IkOPAuT16: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 .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 {
        SimpleDateFwww.cppcns.com
ormat 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 deserializawww.cppcns.comtionContext) 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));
    }

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。