一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - springboot @JsonSerialize的使用講解

springboot @JsonSerialize的使用講解

2022-02-16 14:53FS小山 Java教程

這篇文章主要介紹了springboot @JsonSerialize的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

 

@JsonSerialize的使用講解

解決前端顯示和后臺存儲數據單位不一致的問題。

在返回對象時,進行自定義數據格式轉換。

 

1.寫一個類繼承JsonSerializer 抽象類

實現其serialize()方法,然后在方法中寫入轉換規則即可

舉例是把Date時間戳從 毫秒 轉換成 秒 為單位

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider; 
import java.io.IOException;
import java.util.Date;
 
/**
 * @program: sell
 * @description: 時間轉換Json序列化工具
 * @author: Liang Shan
 * @create: 2019-08-06 16:58
 **/
public class Date2LongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}

 

2.然后在傳輸的實體類中的屬性上

打上@JsonSerialize注解即可

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.enums.OrderStatusEnum;
import com.ls.sell.enums.PayStatusEnum;
import com.ls.sell.util.serializer.Date2LongSerializer;
import lombok.Data;
import org.hibernate.annotations.DynamicUpdate; 
import javax.persistence.Entity;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.util.Date;
 
/**
 * @program: sell
 * @description: 訂單主表
 * @author: Liang Shan
 * @create: 2019-07-24 09:44
 **/
@Entity
@Data
@DynamicUpdate
public class OrderMaster { 
    @Id
    private String orderId; 
    private String buyerName; 
    private String buyerPhone; 
    private String buyerAddress; 
    private String buyerOpenid; 
    private BigDecimal orderAmount;
 
    /** 訂單狀態,默認為新下單. */
    private Integer orderStatus = OrderStatusEnum.NEW.getCode(); 
    /** 支付狀態,默認為0未支付. */
    private Integer payStatus = PayStatusEnum.WAIT.getCode(); 
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date createTime; 
    @JsonSerialize(using = Date2LongSerializer.class)
    private Date updateTime;
}

 

3.附加:還有一個比較好用的注解

如果返回對象中變量存在null,可以使用@JsonInclude(JsonInclude.Include.NON_NULL)注解來忽略為null的變量,這樣前端比較好處理

package com.ls.sell.dto; 
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.ls.sell.entity.OrderDetail;
import com.ls.sell.entity.OrderMaster;
import lombok.Data; 
import java.util.List;
 
/**
 * @program: sell
 * @description: 數據傳輸對象,傳給前端時忽略值為null的屬性
 * @author: Liang Shan
 * @create: 2019-07-25 16:05
 **/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OrderDTO extends OrderMaster {
    private List<OrderDetail> orderDetailList;
}

使用注解之前的返回值:

springboot @JsonSerialize的使用講解

使用注解之后:

springboot @JsonSerialize的使用講解

還是比較好用的。

 

4.附加:之前附件3的注解,還是有個問題

如果一個一個實體類配置的話,未免太過麻煩,所以可以在配置文件中直接配置,yml配置文件如下:

springboot @JsonSerialize的使用講解

 

@JsonSerialize 相關使用(jsonUtil)

 

基礎注解使用

1、實現JsonSerializer接口

例:

public class MySerializerUtils extends JsonSerializer<Integer> {
    @Override
    public void serialize(Integer status, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        String statusStr = "";
         switch (status) {
             case 0:
                 statusStr = "新建狀態";
                 break;
                 }
                 jsonGenerator.writeString(statusStr);
     }
 }

2、添加注解

注:@JsonSerialize注解,主要應用于數據轉換,該注解作用在該屬性的getter()方法上。

①用在屬性上(自定義的例子)

@JsonSerialize(using = MySerializerUtils.class)
private int status;

②用在屬性上(jackson自帶的用法)

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime sendTime;

③用在空對象上可以轉化

@JsonSerialize
public class XxxxxBody {
 // 該對象暫無字段,直接new了返回
}

 

框架層面的使用

jsonUtil工具類

實現json轉換時所有的null轉為“”

1、實現JsonSerializer類

public class CustomizeNullJsonSerializer {
    public static class NullStringJsonSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator,
                              SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString("");
        }
    }
}

2、實現BeanSerializerModifier類

public class CustomizeBeanSerializerModifier extends BeanSerializerModifier {
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
                                                     BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        for (int i = 0; i < beanProperties.size(); i++) {
            BeanPropertyWriter writer = beanProperties.get(i);
            if (isStringType(writer)) {
                writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer());
            }
        }
        return beanProperties;
    }
    /**
     * 是否是String
     */
    private boolean isStringType(BeanPropertyWriter writer) {
        Class<?> clazz = writer.getType().getRawClass();
        return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
    }
}

3、工具類調用

public class JsonUtil {
//序列化時String 為null時變成""
    private static ObjectMapper mapperContainEmpty = new ObjectMapper();
static {
        mapperContainEmpty.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapperContainEmpty.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapperContainEmpty.setSerializerFactory(mapperContainEmpty.getSerializerFactory()
                .withSerializerModifier(new CustomizeBeanSerializerModifier()));
    }
 /**
     * 將對象轉換為Json串,針對String 類型 null 轉成""
     */
    public static String toJsonContainEmpty(Object o) {
        try {
            return mapperContainEmpty.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
}

 

附:jsonUtil完整代碼

/**
 * json串和對象之間相互轉換工具類
 */
public class JsonUtil {
    private static Logger logger = LoggerFactory.getLogger(JsonUtil.class);
    private static ObjectMapper mapper = new ObjectMapper();
    //序列化時String 為null時變成""
    private static ObjectMapper mapperContainEmpty = new ObjectMapper();
    static {
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setSerializationInclusion(Include.NON_NULL);
        mapperContainEmpty.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapperContainEmpty.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapperContainEmpty.setSerializerFactory(mapperContainEmpty.getSerializerFactory()
                .withSerializerModifier(new CustomizeBeanSerializerModifier()));
    }
    /**
     * 將對象轉換為Json串
     */
    public static String toJson(Object o) {
        try {
            return mapper.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
    /**
     * 將對象轉換為Json串,針對String 類型 null 轉成""
     */
    public static String toJsonContainEmpty(Object o) {
        try {
            return mapperContainEmpty.writeValueAsString(o);
        } catch (IOException e) {
            logger.error("render object to json error: {}", e.getMessage(), e);
            throw new RuntimeException("render object to json error!", e);
        }
    }
    /**
     * 將Json串轉換為對象
     */
    public static <T> T toObject(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (IOException e) {
            logger.error("render json to object error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to object error!", e);
        }
    }
    /**
     * 將Json串轉換為List
     */
    public static <T> List<T> toList(String json, Class<T> clazz) {
        try {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, clazz);
            return mapper.readValue(json, javaType);
        } catch (IOException e) {
            logger.error("render json to List<T> error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to List<T> error!", e);
        }
    }
    /**
     * 將Json串轉換為Map
     */
    public static <K, V> Map<K, V> toMap(String json, Class<K> clazzKey, Class<V> clazzValue) {
        try {
            JavaType javaType = mapper.getTypeFactory().constructParametricType(Map.class, clazzKey, clazzValue);
            return mapper.readValue(json, javaType);
        } catch (IOException e) {
            logger.error("render json to Map<K, V> error: {}", e.getMessage(), e);
            throw new RuntimeException("render json to Map<K, V> error!", e);
        }
    }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_28021299/article/details/98635201

延伸 · 閱讀

精彩推薦
  • Java教程mybatis入門_動力節點Java學院整理

    mybatis入門_動力節點Java學院整理

    這篇文章主要為大家詳細介紹了mybatis入門的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    luoyan9802020-12-28
  • Java教程java中以DES的方式實現對稱加密并提供密鑰的實例

    java中以DES的方式實現對稱加密并提供密鑰的實例

    這篇文章主要介紹了java中以DES的方式實現對稱加密并提供密鑰的實例的相關資料,這里提供實例幫助大家學習理解這部分知識,需要的朋友可以參考下...

    Sahadev_4042020-12-11
  • Java教程新手初學Java數組

    新手初學Java數組

    數組是相同類型數據的有序集合數組描述的是相同類型的若干個數據,按照一定的先后次序排列組合而成。其中,每一個數據稱作一個數組元素,每個數組元素...

    Prpr君9142021-09-28
  • Java教程新手了解java基礎知識(一)

    新手了解java基礎知識(一)

    這篇文章主要介紹了Java基礎知識,本文介紹了Java語言相關的基礎知識、歷史介紹、主要應用方向等內容,需要的朋友可以參考下,希望對你有所幫助...

    保護眼睛5122021-09-26
  • Java教程Java中Json解析的方法分析

    Java中Json解析的方法分析

    這篇文章主要介紹了Java中Json解析的方法,結合實例形式分析了java針對json格式數據的解析實現步驟與相關操作技巧,需要的朋友可以參考下...

    張旭小俠2002020-10-05
  • Java教程Springboot使用@RefreshScope注解實現配置文件的動態加載

    Springboot使用@RefreshScope注解實現配置文件的動態加載

    本文主要介紹了Springboot使用@RefreshScope注解實現配置文件的動態加載,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參...

    小布19946572021-12-24
  • Java教程淺談JAVA工作流的優雅實現方式

    淺談JAVA工作流的優雅實現方式

    這篇文章主要介紹了淺談JAVA工作流的優雅實現方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    一代天驕6922021-06-17
  • Java教程java身份證合法性校驗工具類實例代碼

    java身份證合法性校驗工具類實例代碼

    這篇文章主要給大家介紹了關于java身份證合法性校驗工具類的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價...

    哈嘍!沃爾德2852020-09-09
主站蜘蛛池模板: 丝瓜茄子绿巨人秋葵榴莲污 | 亚洲国产成人精品 | 国产成人免费 | 天天天天天天天操 | 日本mv精品中文字幕 | 韩国甜性涩爱在线播放 | 成人免费视频一区二区三区 | 免费视频片在线观看 | 男人桶女下面60分钟视频 | 四虎精品永久免费 | 久久综合久综合久久鬼色 | 久久青草费线频观看国产 | aaaaa特级毛片 | 全色黄大色黄大片爽一次 | 国产福利微拍精品一区二区 | 9自拍视频在线观看 | 91桃色网站| 国产成人精品高清在线 | 日本加勒比一区 | 黄色大片三级 | 激情视频激情小说 | 午夜私人影院在线观看 | 视频二区 素人 欧美 日韩 | 热热99| 草草影院国产 | 国产亚洲一欧美一区二区三区 | 成人高清视频在线观看 | 2021国产精品视频一区 | 国产一级毛片潘金莲的奶头 | jzjzjz日本在线观看 | 欧美日韩一区二区综合在线视频 | 欧美视频在线一区二区三区 | 美女被爆 | 日本国产最新一区二区三区 | 日本不卡一区二区三区在线观看 | 欧美高清无砖专区欧美精品 | 亚洲码和乱人伦中文一区 | pregnanthd产子 | bbwfreehd女厕所ved | 欧美性4khd720 | 成功精品影院 |