背景 项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下: spring: jackson: time-zone: Asia/Shangh
项目中使用WRITE_DATES_AS_TIMESTAMPS: true
转换日期格式为时间戳未生效。如下:
spring: jackson: time-zone: Asia/Shanghai serialization: WRITE_DATES_AS_TIMESTAMPS: true
尝试是否关于时间的注解是否会生效,使用@JSONFORMa
和@jsonFiled
均失效。
@JsonFormat是用于指定Java对象序列化为JSON字符串时的格式化方式的注解。如果@JsonFormat失效,可能是以下原因:
- 未正确导入Jackson库
- 注解位置不正确
- 注解参数设置错误
解决方法:
<dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>2.12.3version>dependency>
确认注解位置是否正确,例如:
public class User { @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; // ...}
确认注解参数是否正确设置,例如:
@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()); }}
@Configurationpublic 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; }}
@Autowired(required = false)private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;@Overridepublic 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;@Overridepublic 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
,它将寻找一个视图来呈现。当指定了@RequestBody
或@RestControlle
r时,我们会告诉Spring跳过这一步,将java对象通过model写入响应结果。Spring通过HttpMessageConverter
来执行Java对象向其它类型(通常是Json)的转换,Spring默认使用的是 MappingJackson2HttpMessageConverter
,所以如果希望使用Gson来执行这种转换,可用使用GsonHttpMessageConverter
替换Jackson
。
在Spring Boot提供了与三个JSON映射库的集成:Gson、默认库 Jackson 、JSON-B
@JsonFormat
@JsonFormat是Java中的一个Jackson注解,用于指定某个字段或属性,或整个类的JSON序列化或反序列化格式。它允许在将数据类型转换为或从JSON格式转换时自定义日期、数字、布尔值等数据类型的格式。
例如,如果您有一个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"作为属性名。
区别
@JsonFormat和@JSONField都是用于控制Java对象属性在序列化为JSON字符串时的格式,但是它们有一些不同之处。
@JsonFormat是Jackson库中的一个注解,用于指定Java对象属性在序列化为JSON字符串时的日期、时间、数字等格式。例如,可以使用@JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”)指定Java对象属性在序列化为JSON字符串时使用指定的日期时间格式。
@JSONField是阿里巴巴的fastjson库中的一个注解,用于指定Java对象属性在序列化为JSON字符串时的名称、顺序、格式等信息。例如,可以使用@JSONField(name=“username”)指定Java对象属性在序列化为JSON字符串时使用"username"作为属性名。
因此,虽然@JsonFormat和@JSONField都可以用于控制Java对象属性在序列化为JSON字符串时的格式,但是它们的作用范围和使用方式略有不同。
依赖HttpMessageConverter默认实现如下:
jackson:MappingJackson2HttpMessageConverter;
gson:GsonHttpMessageConverter;
fastjson : FastJsonHttpMessageConverter
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; }}
public class MyClass { @JsonSerialize(using = DateToJsonSerializer .class) private Date myDate; // ...}
翩若惊鸿,婉若游龙。 来源地址:https://blog.csdn.net/qq_35764295/article/details/129718739
--结束END--
本文标题: 一文了解Jackson注解@JsonFormat及失效解决
本文链接: https://lsjlt.com/news/390609.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-01
2024-04-03
2024-04-03
2024-01-21
2024-01-21
2024-01-21
2024-01-21
2023-12-23
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0