alibaba / fastjson

FASTJSON 2.0.x has been released, faster and more secure, recommend you upgrade.
https://github.com/alibaba/fastjson2/wiki/fastjson_1_upgrade_cn
Apache License 2.0
25.73k stars 6.5k forks source link

java.sql.Date 在toJSONString时,希望可以通过参数控制是否受SerializerFeature.WriteDateUseDateFormat格式控制 #4518

Open dengxiaolong1205 opened 2 months ago

dengxiaolong1205 commented 2 months ago

FastJson 1.2.68版本在toJSONStringWithDateFormat时,会将java.sql.date默认处理成数据库存储格式yyyy-MM-dd,但是升级到1.2.83后,java.sql.date会受传参SerializerFeature.WriteDateUseDateFormat的格式进行格式化,经查看是有人提了issue #3473,使java.sql.date的格式化会跟随SerializerFeature.WriteDateUseDateFormat的格式进行格式化,但是当查询数据中的时间类型既有日期也有日期时间的时候,希望在格式化的时候,java.sql.date不受SerializerFeature.WriteDateUseDateFormat的格式控制,默认格式化为数据库存储格式yyyy-MM-dd,java.sql.datetime受SerializerFeature.WriteDateUseDateFormat的格式控制,格式化为yyyy-MM-dd HH:mm:ss,当前是无法实现的,期望可以增加一个参数,控制java.sql.date是否受SerializerFeature.WriteDateUseDateFormat的格式控制

kimmking commented 2 months ago

这个需求不应该放到框架,可以在应用侧实现。 写两个方法: 一个带WriteDateUseDateFormat方法,一个不带。 然后定一个系统变量,调用json序列化的时候,控制用这两个方法中的哪个。

dengxiaolong1205 commented 2 months ago

这个需求不应该放到框架,可以在应用侧实现。 写两个方法: 一个带WriteDateUseDateFormat方法,一个不带。 然后定一个系统变量,调用json序列化的时候,控制用这两个方法中的哪个。

但是我们应用场景中会出现同时返回java.sql.date和java.sql.datetime两种形式,这种情况下就没办法调两个方法来实现。1.2.68版本对java.sql.date是默认格式化为数据库存储格式的,后来有人对此处理提出issue,将此处理进行了变更,如果没传WriteDateUseDateFormat,默认格式化为数据库存储格式,如果传了WriteDateUseDateFormat,按传过来的时间格式进行格式化,但我认为,既然1.2.68版本对java.sql.date的处理是默认处理为数据库存储格式,那么就表示有人有和我类似的场景需求,不然不会在1.2.68版本加这个处理逻辑,同时toJSONStringWithDateFormat的SerializerFeature传参本身支持多个,是可以在增加一个枚举来单独控制java.sql.date是否仅格式化为数据库存储的格式的,通过扩展一个枚举让这个序列化更灵活,以解决java.sql.date和java.sql.datetime两种类型共存,但是希望转成json字符串中,分别格式化为yyyy-MM-dd和yyyy-MM-dd HH:mm:ss类型的需求,同时不传这个参数的话,就会按WriteDateUseDateFormat的逻辑处理,即解决了之前提issuse同学的问题,也解决了我这边的需求