@JsonSerialize序列化注解的使用
@JsonSerialize序列化注解
JSON 是數(shù)據(jù)交換的通用格式
@JsonSerialize注解是Jackson 庫(kù)中的一部分,用于定義在將 Java 對(duì)象序列化為 JSON 格式時(shí),如何進(jìn)行定制化處理的方式。
Jackson 是一個(gè)流行的 Java 庫(kù),用于處理 JSON 數(shù)據(jù)的序列化和反序列化??梢栽谧侄巍⒎椒ɑ蛘哳惣?jí)上自定義序列化類。有using 屬性,允許指定一個(gè)自定義的序列化器(Serializer)類,來(lái)決定如何將 Java 對(duì)象轉(zhuǎn)換為 JSON 數(shù)據(jù)。
用來(lái)自定義需要轉(zhuǎn)換為JSON數(shù)據(jù),可以用在類上,自定義對(duì)這個(gè)類的JSON處理,也可以用在字段上自定義對(duì)字段的處理,例如日期格式、小數(shù)點(diǎn)保留幾位,是否準(zhǔn)換為1或0
先創(chuàng)建一個(gè)類
package com.test.hello.vo;
import com.test.hello.utils.Customer1DoubleSerialize;
import com.test.hello.utils.CustomerDoubleSerialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestVo {
//使用方法,直接加載需要保留小數(shù)的字段上
@JsonSerialize(using = Customer1DoubleSerialize.class)
private Double num;
@ApiModelProperty("id")
private String Id;
@ApiModelProperty("名")
private String name;
@ApiModelProperty("數(shù)據(jù)類型")
@ExcelProperty(converter = UnitConverter.class)
private String dataType;
}小數(shù)點(diǎn)保留一位數(shù)
package com.test.hello.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class Customer1DoubleSerialize extends JsonSerializer {
private DecimalFormat df = new DecimalFormat("0.0");
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
df.setRoundingMode(RoundingMode.HALF_DOWN);
if(o.toString() != null && !"-".equals(o)) {
Double dd=Double.parseDouble(o.toString());
jsonGenerator.writeString(df.format(dd));
} else{
jsonGenerator.writeString(o.toString());
}
}
}小數(shù)點(diǎn)保留2位數(shù)(保留三位同理定義三位小數(shù)即可)
package com.test.hello.utils;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
public class CustomerDoubleSerialize extends JsonSerializer {
private DecimalFormat df = new DecimalFormat("0.00");
@Override
public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
df.setRoundingMode(RoundingMode.HALF_DOWN);
if(o.toString() != null && !"-".equals(o)) {
Double dd=Double.parseDouble(o.toString());
jsonGenerator.writeString(df.format(dd));
} else{
jsonGenerator.writeString(o.toString());
}
}
}在excel導(dǎo)出的時(shí)候——拼接單位
package com.test.hello.utils;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class UnitConverter implements Converter<String> {
@Override
public Class<?> supportJavaTypeKey() {
return Converter.super.supportJavaTypeKey();
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return Converter.super.supportExcelTypeKey();
}
@Override
public WriteCellData<?> convertToExcelData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
String dateValue = "";
if (value.equals("2D")) {
dateValue = "km";
} else if (value.equals("3D")) {
dateValue = "km2";
}
return new WriteCellData<>(dateValue);
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
劍指Offer之Java算法習(xí)題精講鏈表與數(shù)組專項(xiàng)訓(xùn)練
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
Java中的CyclicBarrier循環(huán)柵欄深入解析
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄深入解析,CycleBarrier 它就相當(dāng)于是一個(gè)柵欄,所有線程在到達(dá)柵欄后都需要等待其他線程,等所有線程都到達(dá)后,再一起通過(guò),需要的朋友可以參考下2023-12-12
關(guān)于Java HashMap自動(dòng)排序的簡(jiǎn)單剖析
這篇文章主要給大家介紹了關(guān)于Java HashMap自動(dòng)排序的簡(jiǎn)單剖析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
基于OpenID?Connect及Token?Relay實(shí)現(xiàn)Spring?Cloud?Gateway
這篇文章主要介紹了基于OpenID?Connect及Token?Relay實(shí)現(xiàn)Spring?Cloud?Gateway,Spring?Cloud?Gateway旨在提供一種簡(jiǎn)單而有效的方式來(lái)路由到API,并為API提供跨領(lǐng)域的關(guān)注點(diǎn),如:安全性、監(jiān)控/指標(biāo)和彈性2022-06-06
spring導(dǎo)入framework報(bào)紅問(wèn)題
這篇文章主要介紹了spring導(dǎo)入framework報(bào)紅問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
解析Java的InputStream類并借助其讀取ppt文件
這篇文章主要介紹了Java的InputStream類并借助其讀取ppt文件,講到了InputStream類中一些常用的方法的問(wèn)題,需要的朋友可以參考下2015-11-11
java基于Socket做一個(gè)簡(jiǎn)單下載器
這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡(jiǎn)單下載器,感興趣的小伙伴們可以參考一下2016-08-08

