一篇文章了解Jackson注解@JsonFormat及失效解決辦法
背景
項(xiàng)目中使用WRITE_DATES_AS_TIMESTAMPS: true轉(zhuǎn)換日期格式為時間戳未生效。如下:
spring:
jackson:
time-zone: Asia/Shanghai
serialization:
WRITE_DATES_AS_TIMESTAMPS: true
嘗試是否關(guān)于時間的注解是否會生效,使用@JsonForma和@JsonFiled均失效。
常見失效原因及解決方法
@JsonFormat是用于指定Java對象序列化為JSON字符串時的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:
未正確導(dǎo)入Jackson庫
注解位置不正確
注解參數(shù)設(shè)置錯誤
解決方法:
- 確認(rèn)是否正確導(dǎo)入了Jackson庫,可以在pom.xml文件中添加以下依賴:
<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;
}
以上是常見的解決方法,如果還有問題可以提供更具體的錯誤信息進(jì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庫,從4.1開始,springframework支持通過配置GsonHttpMessageConverter的方式使用Gson。
在Spring MVC中,一旦請求退出@Controller,它將尋找一個視圖來呈現(xiàn)。當(dāng)指定了@RequestBody或@RestController時,我們會告訴Spring跳過這一步,將java對象通過model寫入響應(yīng)結(jié)果。Spring通過HttpMessageConverter來執(zhí)行Java對象向其它類型(通常是Json)的轉(zhuǎn)換,Spring默認(rèn)使用的是 MappingJackson2HttpMessageConverter,所以如果希望使用Gson來執(zhí)行這種轉(zhuǎn)換,可用使用GsonHttpMessageConverter替換Jackson。
小拓展
在Spring Boot提供了與三個JSON映射庫的集成:Gson、默認(rèn)庫 Jackson 、JSON-B
@JsonFormat與@JSONField簡介
@JsonFormat
@JsonFormat是Java中的一個Jackson注解,用于指定某個字段或?qū)傩?,或整個類的JSON序列化或反序列化格式。它允許在將數(shù)據(jù)類型轉(zhuǎn)換為或從JSON格式轉(zhuǎn)換時自定義日期、數(shù)字、布爾值等數(shù)據(jù)類型的格式。
例如,如果您有一個Java類,其中包含一個Date字段,您希望以特定格式將其序列化為JSON,您可以使用@JsonFormat注解來指定該格式:
示例如下:Jackson在序列化或反序列化myDate字段時使用“yyyy-MM-dd”格式。
public class MyClass {
@JsonFormat(pattern="yyyy-MM-dd")
private Date myDate;
// ...
}
@JSONField
@JSONField是阿里巴巴的fastjson庫中的一個注解,用于指定Java對象屬性在序列化為JSON字符串時的名稱、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對象屬性在序列化為JSON字符串時使用"username"作為屬性名。
區(qū)別
@JsonFormat和@JSONField都是用于控制Java對象屬性在序列化為JSON字符串時的格式,但是它們有一些不同之處。
@JsonFormat是Jackson庫中的一個注解,用于指定Java對象屬性在序列化為JSON字符串時的日期、時間、數(shù)字等格式。例如,可以使用@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)指定Java對象屬性在序列化為JSON字符串時使用指定的日期時間格式。
@JSONField是阿里巴巴的fastjson庫中的一個注解,用于指定Java對象屬性在序列化為JSON字符串時的名稱、順序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java對象屬性在序列化為JSON字符串時使用"username"作為屬性名。
因此,雖然@JsonFormat和@JSONField都可以用于控制Java對象屬性在序列化為JSON字符串時的格式,但是它們的作用范圍和使用方式略有不同。
jackson自定義日期注解
依賴HttpMessageConverter默認(rèn)實(shí)現(xiàn)如下:
jackson:MappingJackson2HttpMessageConverter;

gson:GsonHttpMessageConverter;

fastjson : FastJsonHttpMessageConverter
1、自定義轉(zhuǎn)換類:
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Jackson使用示例-Bean、XML、Json之間相互轉(zhuǎn)換
- Java中對象?和?json?互轉(zhuǎn)四種方式?json-lib、Gson、FastJson、Jackson
- 利用Jackson解決Json序列化和反序列化問題
- Java利用Jackson輕松處理JSON序列化與反序列化
- Jackson中json格式的字符串與對象的互相轉(zhuǎn)換方式
- 如何自定義Jackson序列化?@JsonSerialize
- JSON中fastjson、jackson、gson如何選擇
- jackson 如何將實(shí)體轉(zhuǎn)json json字符串轉(zhuǎn)實(shí)體
- 使用jackson實(shí)現(xiàn)對象json之間的相互轉(zhuǎn)換(spring boot)
- 使用Jackson-json解析一個嵌套的json字符串
- Jackson庫進(jìn)行JSON?序列化時遇到了無限遞歸(Infinite?Recursion)的問題及解決方案
相關(guān)文章
Java中的線程池ThreadPoolExecutor細(xì)致講解
這篇文章主要介紹了Java中的線程池ThreadPoolExecutor細(xì)致講解,線程池是一種基于池化思想管理線程的工具,經(jīng)常出現(xiàn)在多線程服務(wù)器中,如MySQL,線程過多會帶來額外的開銷,其中包括創(chuàng)建銷毀線程的開銷、調(diào)度線程的開銷等等,需要的朋友可以參考下2023-11-11
Mybatis之解決collection一對多問題(顯示的結(jié)果沒有整合到一起)
這篇文章主要介紹了Mybatis之解決collection一對多問題(顯示的結(jié)果沒有整合到一起),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
利用solr實(shí)現(xiàn)商品的搜索功能(實(shí)例講解)
下面小編就為大家分享一篇利用solr實(shí)現(xiàn)商品的搜索功能,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
drools規(guī)則動態(tài)化實(shí)踐解析
這篇文章主要為大家介紹了drools規(guī)則動態(tài)化實(shí)踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java 本地方法Native Method詳細(xì)介紹
這篇文章主要介紹了 Java 本地方法Native Method詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-02-02
springboot中@RequestParam和@PathVariable區(qū)別
本文主要介紹了springboot中@RequestParam和@PathVariable區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-07-07

