fastjson2
fastjson2 copied to clipboard
[BUG] 时间方面的执行format 如果配置全局序列化,@JSONFeild注解中的format失效
问题描述
简要描述您碰到的问题。 时间方面的执行format 如果配置全局序列化,@JSONFeild注解中的format失效
环境信息
请填写以下信息:
- OS信息: [e.g.:CentOS 8.4.2105 4Core 3.10GHz 16 GB]
- JDK信息: [e.g.:Openjdk 1.8.0_312]
- 版本信息:[e.g.:Fastjson2 2.x.x]
重现步骤
如何操作可以重现该问题:
- 使用
xxx.xxx
方法 - 输入
...
数据 - 出现
...
错误
//可在此输入示例代码
@RequestMapping("/time3")
public DateVO home3(@RequestBody DateVO date) {
String s = JSON.toJSONString(date);
System.out.println(s);
return date;
}
@Data
public class DateVO implements Serializable {
private LocalDateTime localDateTime;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTimeFormat;
@JSONField(format = "yyyy-MM-dd HH:mm:ss", serializeUsing = DateJson2Serializer.class)
private LocalDateTime localDateTimeFormatCus;
@JSONField(name="date_2",format = "yyyy-MM-dd HH:mm:ss")
private Date date2;
@JSONField(format = "yyyy-MM-dd")
private Date dateCus;
private Date dateOb;
}
// 请求参数
{
"date":"2033-02-20 16:13:25",
"localDateTime":"2013-02-20 16:23:25",
"localDateTimeFormat":"2023-02-20 16:03:25",
"localDateTimeFormatCus":"2023-02-20 16:03:25",
"dateOb": "2023-02-20 16:03:25",
"dateCus": "2023-02-20 16:03:25",
"date2":"2023-02-20 16:33:25"
}
//返回结果
{
"dateCus": "Mon Feb 20 16:03:25 CST 2023",
"dateOb": "Mon Feb 20 16:03:25 CST 2023",
"date_2": "Mon Feb 20 16:33:25 CST 2023",
"localDateTime": "2013-02-20 08:23:25",
"localDateTimeFormatCus": "02-20 08:03:25",
"localDateTimeFormatCus": "02-20 08:03:25",
}
期待的正确结果
对您期望发生的结果进行清晰简洁的描述。 希望如果有@JSONField 注解,优先加载JSONField 注解配置的参数。再执行自定义全局,最后执行全局默认参数。
相关日志输出
请复制并粘贴任何相关的日志输出。
附加信息
如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。
你是用什么方式配置全局序列化的?
在 @Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
serializeConfig.put(Date.class, new InetAddress2Writer());
//serializeConfig.put(LocalDateTime.class, new InetAddressWriter());
fastJsonConfig.setSerializeConfig(serializeConfig);
JSON.register(LocalDateTime.class, InetAddressWriter.INSTANCE);
JSON.register(Date.class, InetAddress2Writer.INSTANCE);
JSON.register(LocalDateTime.class, LocalReader.INSTANCE);
JSON.register(LocalDateTime.class, new LocalDeserializer());
JSON.register(Date.class, new LocalDeserializer());
}
https://github.com/alibaba/fastjson2/issues/1140
可以看一下上面链接这个问题吗,有没有可以实现一个接口获取 属性上的@JSONField 注解中的参数
我也遇到了这个问题,全局配置默认日期格式后,个别对象需要个性化格式的时候,使用@JSONField配置就失效了,只能认全局日期格式处理类。如果去掉全局日期处理类,@JSONField格式是生效的,但是其它默认没有使用@JSONField的属性,默认格式又都不对啦。
是全局默认格式配置方式不对?怎么解决这个全局配置优于局部属性配置的功能?
自己摸索出来了Date类的完美解决方案: 1 不调用JSON.register全局注册Date.class的处理逻辑,改为JSON.configWriterDateFormat配置全局默认格式。 2 在需要个性化输出日期格式的场景,使用@JSONField注解自定义局部输出格式。
建议支持LocalDate/LocalTime/LocalDateTime类类似的功能支持。
**建议:**在序列化的时候可以判断一下有没有@JSONField配置,如果没有就用全局默认格式化,如果有就使用局部配置。这样通过JSON.register注册的个性化格式转换器也会默认拥有这个特性,否则一旦调用JSON.register就无法实现局部个性化配置功能了。
@wenshao 这个还没解决吗?
这个问题真是头大,全局只能配置 dateTime 的,竟然还能作用于 LocalTime