fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] 时间方面的执行format 如果配置全局序列化,@JSONFeild注解中的format失效

Open sly-APalmCat opened this issue 2 years ago • 7 comments

问题描述

简要描述您碰到的问题。 时间方面的执行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]

重现步骤

如何操作可以重现该问题:

  1. 使用 xxx.xxx 方法
  2. 输入 ... 数据
  3. 出现 ... 错误
//可在此输入示例代码
	@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 注解配置的参数。再执行自定义全局,最后执行全局默认参数。

相关日志输出

请复制并粘贴任何相关的日志输出。

附加信息

如果你还有其他需要提供的信息,可以在这里填写(可以提供截图、视频等)。

sly-APalmCat avatar Feb 23 '23 08:02 sly-APalmCat

你是用什么方式配置全局序列化的?

wenshao avatar Feb 23 '23 20:02 wenshao

在 @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());

}

sly-APalmCat avatar Feb 24 '23 01:02 sly-APalmCat

https://github.com/alibaba/fastjson2/issues/1140

可以看一下上面链接这个问题吗,有没有可以实现一个接口获取 属性上的@JSONField 注解中的参数

sly-APalmCat avatar Feb 24 '23 01:02 sly-APalmCat

我也遇到了这个问题,全局配置默认日期格式后,个别对象需要个性化格式的时候,使用@JSONField配置就失效了,只能认全局日期格式处理类。如果去掉全局日期处理类,@JSONField格式是生效的,但是其它默认没有使用@JSONField的属性,默认格式又都不对啦。

是全局默认格式配置方式不对?怎么解决这个全局配置优于局部属性配置的功能?

BruceAn1978 avatar Jul 24 '23 09:07 BruceAn1978

自己摸索出来了Date类的完美解决方案: 1 不调用JSON.register全局注册Date.class的处理逻辑,改为JSON.configWriterDateFormat配置全局默认格式。 2 在需要个性化输出日期格式的场景,使用@JSONField注解自定义局部输出格式。

建议支持LocalDate/LocalTime/LocalDateTime类类似的功能支持。

**建议:**在序列化的时候可以判断一下有没有@JSONField配置,如果没有就用全局默认格式化,如果有就使用局部配置。这样通过JSON.register注册的个性化格式转换器也会默认拥有这个特性,否则一旦调用JSON.register就无法实现局部个性化配置功能了。

BruceAn1978 avatar Jul 24 '23 10:07 BruceAn1978

@wenshao 这个还没解决吗?

oooopl avatar Nov 22 '23 03:11 oooopl

这个问题真是头大,全局只能配置 dateTime 的,竟然还能作用于 LocalTime

oooopl avatar Dec 14 '23 05:12 oooopl