jackson設(shè)置返回null為空字符串的操作
1、將接口返回的字段為null的設(shè)置為空字符串:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; @Configuration public class CustomConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() { @Override public void serialize(Object paramT, JsonGenerator paramJsonGenerator, SerializerProvider paramSerializerProvider) throws IOException { //設(shè)置返回null轉(zhuǎn)為 空字符串"" paramJsonGenerator.writeString(""); } }); return objectMapper; } }
2、設(shè)置null字段不返回給前端:
//1.實(shí)體上 @JsonInclude(Include.NON_NULL) //將該標(biāo)記放在屬性上,如果該屬性為NULL則不參與序列化 //如果放在類(lèi)上邊,那對(duì)這個(gè)類(lèi)的全部屬性起作用 //Include.Include.ALWAYS 默認(rèn) //Include.NON_DEFAULT 屬性為默認(rèn)值不序列化 //Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化 //Include.NON_NULL 屬性為NULL 不序列化 //2.代碼上 ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(Include.NON_NULL); //通過(guò)該方法對(duì)mapper對(duì)象進(jìn)行設(shè)置,所有序列化的對(duì)象都將按改規(guī)則進(jìn)行系列化 //Include.Include.ALWAYS 默認(rèn) //Include.NON_DEFAULT 屬性為默認(rèn)值不序列化 //Include.NON_EMPTY 屬性為 空(“”) 或者為 NULL 都不序列化 //Include.NON_NULL 屬性為NULL 不序列化
來(lái)驗(yàn)證下結(jié)果,很顯然,我們成功了,age、address、sex三個(gè)字段值為null,現(xiàn)在看到是空字符串:
補(bǔ)充知識(shí):SpringBoot Jackson 將null轉(zhuǎn)字符串"" ,List、Array轉(zhuǎn)[],Int轉(zhuǎn)0
如下所示:
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import org.apache.commons.lang3.StringUtils; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.io.IOException; import java.util.Collection; import java.util.List; /** * 使用官方自帶的json格式類(lèi)庫(kù),fastjson因?yàn)閏ontent type問(wèn)題時(shí)不時(shí)控制臺(tái)報(bào)錯(cuò)、無(wú)法直接返回二進(jìn)制等問(wèn)題 */ class JacksonHttpMessageConverter extends MappingJackson2HttpMessageConverter { /** * 處理數(shù)組類(lèi)型的null值 */ public class NullArrayJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { if (value == null) { jgen.writeStartArray(); jgen.writeEndArray(); } } } /** * 處理字符串類(lèi)型的null值 */ public class NullStringJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeString(StringUtils.EMPTY); } } /** * 處理數(shù)字類(lèi)型的null值 */ public class NullNumberJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeNumber(0); } } /** * 處理布爾類(lèi)型的null值 */ public class NullBooleanJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeBoolean(false); } } public class MyBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { //循環(huán)所有的beanPropertyWriter for (Object beanProperty : beanProperties) { BeanPropertyWriter writer = (BeanPropertyWriter) beanProperty; //判斷字段的類(lèi)型,如果是array,list,set則注冊(cè)nullSerializer if (isArrayType(writer)) { //給writer注冊(cè)一個(gè)自己的nullSerializer writer.assignNullSerializer(new NullArrayJsonSerializer()); } else if (isNumberType(writer)) { writer.assignNullSerializer(new NullNumberJsonSerializer()); } else if (isBooleanType(writer)) { writer.assignNullSerializer(new NullBooleanJsonSerializer()); } else if (isStringType(writer)) { writer.assignNullSerializer(new NullStringJsonSerializer()); } } return beanProperties; } /** * 是否是數(shù)組 */ private boolean isArrayType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.isArray() || Collection.class.isAssignableFrom(clazz); } /** * 是否是string */ private boolean isStringType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz); } /** * 是否是int */ private boolean isNumberType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return Number.class.isAssignableFrom(clazz); } /** * 是否是boolean */ private boolean isBooleanType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.equals(Boolean.class); } } JacksonHttpMessageConverter() { getObjectMapper().setSerializerFactory(getObjectMapper().getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier())); } }
一定要在下面配置消息轉(zhuǎn)換器,不然沒(méi)效果
@Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { super.configureMessageConverters(converters); converters.add(new JacksonHttpMessageConverter()); } }
如果想要更豐富的可以在:MyBeanSerializerModifier中自定義。
以上這篇jackson設(shè)置返回null為空字符串的操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis-Plus實(shí)現(xiàn)條件查詢(xún)的三種格式例舉詳解
本文主要介紹了MyBatis-Plus三中條件查詢(xún)格式的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08SpringBoot集成SSM、Dubbo、Redis、JSP的案例小結(jié)及思路講解
這個(gè)案例其實(shí)就是SpringBoot集成SSM、Dubbo、Redis、JSP,看起來(lái)感覺(jué)很繁瑣,其實(shí)就是很簡(jiǎn)單,下面通過(guò)案例分析給大家講解,感興趣的朋友跟隨小編一起看看吧2021-05-05IntelliJ IDEA語(yǔ)法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA語(yǔ)法報(bào)錯(cuò)"Usage of API documented as @since 1.6+"的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化
這篇文章主要介紹了Java編程中快速排序算法的實(shí)現(xiàn)及相關(guān)算法優(yōu)化,快速排序算法的最差時(shí)間復(fù)雜度為(n^2),最優(yōu)時(shí)間復(fù)雜度為(n\log n),存在優(yōu)化的空間,需要的朋友可以參考下2016-05-05如何解決springboot自動(dòng)重啟問(wèn)題
這篇文章主要介紹了如何解決springboot自動(dòng)重啟問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09關(guān)于SSM框架下各層的解釋說(shuō)明(Controller等)
這篇文章主要介紹了關(guān)于SSM框架下各層的解釋說(shuō)明(Controller等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02