fastjson @JSONField format 不生效的原因

在使用Fastjson1.2.83版本时,发现http接口返回的Date类型数据未按@JSONField注解格式化。问题在于如果存在全局DateFormat配置,该注解会被忽略。通过查看源码,了解到统一配置的优先级高于局部注解。为使@JSONFieldformat优先级更高,可以通过自定义JSONSerializer类并调整代码,使得在有局部格式化时优先使用。重新编译和打包后问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(以下问题已在fastjson高版本优化<目前我用的是1.2.83版本>)

在一次接手项目中发现,http接口返回json数据,Date类型的变量用@JSONField format注解格式化不起作用。排查原因:

1)查http接口序列化是不是用的fastjson。如果用的是jackson序列化应该使用@JsonFormat注解。

2)找到fastjson配置入口,查看有没有设置统一的DateFormat配置

如果配置类设置了统一的DateFormat,则@JSONField format注解会失效,以统一配置为准。如果没有配置统一的DateFormat,@JSONField format 则有效。

为什么呢?按理说局部配置的优先级应该要大于统一配置的优先级才对。找到对应fastjosn的源码,如下

(1.2.62版本)com.alibaba.fastjson.serializer.JSONSerializer#writeWithFormat

DateFormat dateFormat = this.getDateFormat();//默认配置
if (dateFormat == null) {//重点:只有在没有默认配置下@JSONFiled注解才会生效
    try {
        dateFormat = new SimpleDateFormat(format, locale);//@JSONFiled的配置
    } catch (IllegalArgumentException e) {
        String format2 = format.replaceAll("T", "'T'");
        dateFormat = new SimpleDateFormat(format2, locale);
    }
    dateFormat.setTimeZone(timeZone);
}
String text = dateFormat.format((Date) object);
out.writeString(text);
return;

发现代码中统一配置的dateFormat的优先级就是更高。(感觉逻辑不太合理 QAQ)

能不能让@JSONField format优先级更高?当然是可以。简单的办法就是复制个相同路径JSONSerializer类,把上面这段代码改成

DateFormat dateFormat = this.getDateFormat();
if (format != null && format.length() != 0) {
    try {
        dateFormat = new SimpleDateFormat(format, locale);
    } catch (IllegalArgumentException e) {
        String format2 = format.replaceAll("T", "'T'");
        dateFormat = new SimpleDateFormat(format2, locale);
    }
    dateFormat.setTimeZone(timeZone);
}
String text = dateFormat.format((Date) object);
out.writeString(text);
return;

重新编译、打包。搞定!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值