一篇文章了解Jackson注解@JsonFormat及失效解決辦法
背景
項(xiàng)目中使用WRITE_DATES_AS_TIMESTAMPS: true
轉(zhuǎn)換日期格式為時(shí)間戳未生效。如下:
spring: jackson: time-zone: Asia/Shanghai serialization: WRITE_DATES_AS_TIMESTAMPS: true
嘗試是否關(guān)于時(shí)間的注解是否會(huì)生效,使用@JsonForma
和@JsonFiled
均失效。
常見(jiàn)失效原因及解決方法
@JsonFormat是用于指定Java對(duì)象序列化為JSON字符串時(shí)的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:
未正確導(dǎo)入Jackson庫(kù)
注解位置不正確
注解參數(shù)設(shè)置錯(cuò)誤
解決方法:
- 確認(rèn)是否正確導(dǎo)入了Jackson庫(kù),可以在pom.xml文件中添加以下依賴(lài):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
2、確認(rèn)注解位置是否正確,例如:
public class User { @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; // ... }
3、確認(rèn)注解參數(shù)是否正確設(shè)置,例如:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ") public Date getCreatedDate() { return createdDate; }
以上是常見(jiàn)的解決方法,如果還有問(wèn)題可以提供更具體的錯(cuò)誤信息進(jìn)行排查。
本次問(wèn)題解決
失效原因
因?yàn)轫?xiàng)目中使用了Gson替換Jackson。代碼如下:
import com.google.gson.JsonElement; import com.google.gson.JsonParser; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import springfox.documentation.spring.web.json.Json; import java.lang.reflect.Type; public class JsonToGson implements JsonSerializer<Json> { @Override public JsonElement serialize(Json json, Type type, JsonSerializationContext context) { return JsonParser.parseString(json.value()); } }
@Configuration public class SwaggerWebConfiguration implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/swagger-ui/**") .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/"); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter); converters.add(gsonHttpMessageConverters()); } @Bean public GsonHttpMessageConverter gsonHttpMessageConverters() { Gson gson = new GsonBuilder() .registerTypeAdapter(Json.class, new SpringfoxJsonToGsonAdapter()) .create(); GsonHttpMessageConverter gsonConverter = new GsonHttpMessageConverter(gson); return gsonConverter; } }
解決方案一:去掉Gson轉(zhuǎn)換即可。
解決方案二:重新添加MappingJackson2HttpMessageConverter的bean
@Autowired(required = false) private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter); if (Objects.isNull(mappingJackson2HttpMessageConverter)) { converters.add(0, new MappingJackson2HttpMessageConverter()); } else { converters.add(0, mappingJackson2HttpMessageConverter); } }
或
@Autowired(required = false) private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter); if (Objects.isNull(mappingJackson2HttpMessageConverter)) { converters.add(0, new MappingJackson2HttpMessageConverter()); } else { converters.add(0, mappingJackson2HttpMessageConverter); } }
解析
Jackson一直是springframework默認(rèn)的json庫(kù),從4.1開(kāi)始,springframework支持通過(guò)配置GsonHttpMessageConverter的方式使用Gson。
在Spring MVC
中,一旦請(qǐng)求退出@Controller
,它將尋找一個(gè)視圖來(lái)呈現(xiàn)。當(dāng)指定了@RequestBody
或@RestControlle
r時(shí),我們會(huì)告訴Spring跳過(guò)這一步,將java對(duì)象通過(guò)model寫(xiě)入響應(yīng)結(jié)果。Spring通過(guò)HttpMessageConverter
來(lái)執(zhí)行Java對(duì)象向其它類(lèi)型(通常是Json)的轉(zhuǎn)換,Spring默認(rèn)使用的是 MappingJackson2HttpMessageConverter
,所以如果希望使用Gson來(lái)執(zhí)行這種轉(zhuǎn)換,可用使用GsonHttpMessageConverter
替換Jackson
。
小拓展
在Spring Boot提供了與三個(gè)JSON映射庫(kù)的集成:Gson、默認(rèn)庫(kù) Jackson 、JSON-B
@JsonFormat與@JSONField簡(jiǎn)介
@JsonFormat
@JsonFormat是Java中的一個(gè)Jackson注解,用于指定某個(gè)字段或?qū)傩裕蛘麄€(gè)類(lèi)的JSON序列化或反序列化格式。它允許在將數(shù)據(jù)類(lèi)型轉(zhuǎn)換為或從JSON格式轉(zhuǎn)換時(shí)自定義日期、數(shù)字、布爾值等數(shù)據(jù)類(lèi)型的格式。
例如,如果您有一個(gè)Java類(lèi),其中包含一個(gè)Date字段,您希望以特定格式將其序列化為JSON,您可以使用@JsonFormat注解來(lái)指定該格式:
示例如下:Jackson在序列化或反序列化myDate字段時(shí)使用“yyyy-MM-dd”格式。
public class MyClass { @JsonFormat(pattern="yyyy-MM-dd") private Date myDate; // ... }
@JSONField
@JSONField是阿里巴巴的fastjson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的名稱(chēng)、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用"username"作為屬性名。
區(qū)別
@JsonFormat和@JSONField都是用于控制Java對(duì)象屬性在序列化為JSON字符串時(shí)的格式,但是它們有一些不同之處。
@JsonFormat是Jackson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的日期、時(shí)間、數(shù)字等格式。例如,可以使用@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用指定的日期時(shí)間格式。
@JSONField是阿里巴巴的fastjson庫(kù)中的一個(gè)注解,用于指定Java對(duì)象屬性在序列化為JSON字符串時(shí)的名稱(chēng)、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對(duì)象屬性在序列化為JSON字符串時(shí)使用"username"作為屬性名。
因此,雖然@JsonFormat和@JSONField都可以用于控制Java對(duì)象屬性在序列化為JSON字符串時(shí)的格式,但是它們的作用范圍和使用方式略有不同。
jackson自定義日期注解
依賴(lài)HttpMessageConverter默認(rèn)實(shí)現(xiàn)如下:
jackson:MappingJackson2HttpMessageConverter;
gson:GsonHttpMessageConverter;
fastjson : FastJsonHttpMessageConverter
1、自定義轉(zhuǎn)換類(lèi):
public class DateToJsonSerializer extends JsonSerializer<Date> implements ContextualSerializer { private DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public DateToJsonSerializer() { } @Override public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException { if (null != arg0) { arg1.writeString(this.df.format(arg0)); } } @Override public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) { AnnotationMap annotated = property.getMember().getAllAnnotations(); JsonFormat jsonFormat = annotated.get(JsonFormat.class); if (jsonFormat != null && jsonFormat.pattern() != null){ df = new SimpleDateFormat(jsonFormat.pattern()); } return this; } }
2、使用
public class MyClass { @JsonSerialize(using = DateToJsonSerializer .class) private Date myDate; // ... }
總結(jié)
到此這篇關(guān)于Jackson注解@JsonFormat及失效解決辦法的文章就介紹到這了,更多相關(guān)Jackson注解@JsonFormat及失效解決內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
- Java中對(duì)象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- 利用Jackson解決Json序列化和反序列化問(wèn)題
- Java利用Jackson輕松處理JSON序列化與反序列化
- Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式
- 如何自定義Jackson序列化?@JsonSerialize
- JSON中fastjson、jackson、gson如何選擇
- jackson 如何將實(shí)體轉(zhuǎn)json json字符串轉(zhuǎn)實(shí)體
- 使用jackson實(shí)現(xiàn)對(duì)象json之間的相互轉(zhuǎn)換(spring boot)
- 使用Jackson-json解析一個(gè)嵌套的json字符串
- Jackson庫(kù)進(jìn)行JSON?序列化時(shí)遇到了無(wú)限遞歸(Infinite?Recursion)的問(wèn)題及解決方案
相關(guān)文章
詳解Spring AOP自定義可重復(fù)注解沒(méi)有生效問(wèn)題
本文主要介紹了Spring AOP自定義可重復(fù)注解沒(méi)有生效問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08SpringMVC接收與響應(yīng)json數(shù)據(jù)的幾種方式
這篇文章主要給大家介紹了關(guān)于SpringMVC接收與響應(yīng)json數(shù)據(jù)的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用springmvc具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03SpringBoot使用Nacos配置中心的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot使用Nacos配置中心的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12IntelliJ IDEA 中g(shù)it的使用圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了IntelliJ IDEA 中g(shù)it的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-02-02基于mybatis中數(shù)組傳遞注意事項(xiàng)
這篇文章主要介紹了mybatis中數(shù)組傳遞注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java使用list實(shí)現(xiàn)數(shù)據(jù)庫(kù)的like功能
這篇文章主要介紹了java使用list實(shí)現(xiàn)數(shù)據(jù)庫(kù)的like功能,需要的朋友可以參考下2014-04-04Java實(shí)現(xiàn)去掉字符串重復(fù)字母的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)去掉字符串重復(fù)字母的方法,涉及java針對(duì)字符串的遍歷、判斷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12