欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章了解Jackson注解@JsonFormat及失效解決辦法

 更新時間:2023年11月20日 09:51:27   作者:三省同學  
這篇文章主要給大家介紹了關于如何通過一篇文章了解Jackson注解@JsonFormat及失效解決辦法的相關資料,@JsonFormat注解是一個時間格式化注解,用于格式化時間,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

背景

項目中使用WRITE_DATES_AS_TIMESTAMPS: true轉換日期格式為時間戳未生效。如下:

spring:
  jackson:
    time-zone: Asia/Shanghai
    serialization:
      WRITE_DATES_AS_TIMESTAMPS: true

嘗試是否關于時間的注解是否會生效,使用@JsonForma@JsonFiled均失效。

常見失效原因及解決方法

@JsonFormat是用于指定Java對象序列化為JSON字符串時的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:

未正確導入Jackson庫

注解位置不正確

注解參數(shù)設置錯誤

解決方法:

  • 確認是否正確導入了Jackson庫,可以在pom.xml文件中添加以下依賴:
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.3</version>
</dependency>

2、確認注解位置是否正確,例如:

public class User {
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    // ...
}

3、確認注解參數(shù)是否正確設置,例如:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public Date getCreatedDate() {
    return createdDate;
}

以上是常見的解決方法,如果還有問題可以提供更具體的錯誤信息進行排查。

本次問題解決

失效原因

因為項目中使用了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轉換即可。

解決方案二:重新添加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默認的json庫,從4.1開始,springframework支持通過配置GsonHttpMessageConverter的方式使用Gson。

Spring MVC中,一旦請求退出@Controller,它將尋找一個視圖來呈現(xiàn)。當指定了@RequestBody@RestController時,我們會告訴Spring跳過這一步,將java對象通過model寫入響應結果。Spring通過HttpMessageConverter來執(zhí)行Java對象向其它類型(通常是Json)的轉換,Spring默認使用的是 MappingJackson2HttpMessageConverter,所以如果希望使用Gson來執(zhí)行這種轉換,可用使用GsonHttpMessageConverter替換Jackson

小拓展

在Spring Boot提供了與三個JSON映射庫的集成:Gson、默認庫 Jackson 、JSON-B

@JsonFormat與@JSONField簡介

@JsonFormat

@JsonFormat是Java中的一個Jackson注解,用于指定某個字段或屬性,或整個類的JSON序列化或反序列化格式。它允許在將數(shù)據(jù)類型轉換為或從JSON格式轉換時自定義日期、數(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默認實現(xiàn)如下:

jackson:MappingJackson2HttpMessageConverter;

gson:GsonHttpMessageConverter;

fastjson : FastJsonHttpMessageConverter

1、自定義轉換類:

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;
  // ...
}

總結 

到此這篇關于Jackson注解@JsonFormat及失效解決辦法的文章就介紹到這了,更多相關Jackson注解@JsonFormat及失效解決內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Spring AOP自定義可重復注解沒有生效問題

    詳解Spring AOP自定義可重復注解沒有生效問題

    本文主要介紹了Spring AOP自定義可重復注解沒有生效問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringMVC接收與響應json數(shù)據(jù)的幾種方式

    SpringMVC接收與響應json數(shù)據(jù)的幾種方式

    這篇文章主要給大家介紹了關于SpringMVC接收與響應json數(shù)據(jù)的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用springmvc具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Java多線程實現(xiàn)快速切分文件的程序

    Java多線程實現(xiàn)快速切分文件的程序

    這篇文章主要為大家詳細介紹了Java多線程實現(xiàn)快速切分文件的相關資料,感興趣的小伙伴們可以參考一下
    2016-06-06
  • SpringBoot使用Nacos配置中心的實現(xiàn)

    SpringBoot使用Nacos配置中心的實現(xiàn)

    這篇文章主要介紹了SpringBoot使用Nacos配置中心的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • IntelliJ IDEA 中git的使用圖文教程

    IntelliJ IDEA 中git的使用圖文教程

    本文通過圖文并茂的形式給大家介紹了IntelliJ IDEA 中git的使用,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-02-02
  • Springboot Caffeine本地緩存使用示例

    Springboot Caffeine本地緩存使用示例

    這篇文章主要介紹了Springboot Caffeine本地緩存使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • 基于mybatis中數(shù)組傳遞注意事項

    基于mybatis中數(shù)組傳遞注意事項

    這篇文章主要介紹了mybatis中數(shù)組傳遞注意事項,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • SpringBoot?jwt的token如何刷新

    SpringBoot?jwt的token如何刷新

    這篇文章主要給大家介紹了關于SpringBoot?jwt的token如何刷新的相關資料,Json web token(JWT)是為了在網(wǎng)絡應用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準,需要的朋友可以參考下
    2023-07-07
  • java使用list實現(xiàn)數(shù)據(jù)庫的like功能

    java使用list實現(xiàn)數(shù)據(jù)庫的like功能

    這篇文章主要介紹了java使用list實現(xiàn)數(shù)據(jù)庫的like功能,需要的朋友可以參考下
    2014-04-04
  • Java實現(xiàn)去掉字符串重復字母的方法示例

    Java實現(xiàn)去掉字符串重復字母的方法示例

    這篇文章主要介紹了Java實現(xiàn)去掉字符串重復字母的方法,涉及java針對字符串的遍歷、判斷、運算等相關操作技巧,需要的朋友可以參考下
    2017-12-12

最新評論