返回顶部
首页 > 资讯 > 精选 >fastjson全局日期序列化设置导致JSONField失效如何解决
  • 511
分享到

fastjson全局日期序列化设置导致JSONField失效如何解决

2023-07-04 22:07:10 511人浏览 薄情痞子
摘要

本篇内容主要讲解“fastJSON全局日期序列化设置导致jsONField失效如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“fastjson全局日期序列化设置导致JSONField失效如

本篇内容主要讲解“fastJSON全局日期序列化设置导致jsONField失效如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“fastjson全局日期序列化设置导致JSONField失效如何解决”吧!

问题描述

fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊日期返回格式失效

使用版本

应用名称版本
SpringBoot2.0.0.RELEASE
fastjson1.2.83

全局设置代码

public class WEBConfig implements WebmvcConfigurer {    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        //1.需要定义一个convert转换消息的对象;        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;        FastJsonConfig fastJsonConfig = new FastJsonConfig();        //全局指定了日期格式        fastJsonConfig.setDateFORMat("yyyy-MM-dd HH:mm:ss");        //3处理中文乱码问题        List<MediaType> fastMediaTypes = new ArrayList<>();        fastMediaTypes.add(MediaType.APPLICATioN_JSON_UTF8);        //4.在convert中添加配置信息.        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);        //5.将convert添加到converters当中.        converters.add(fastJsonHttpMessageConverter);    }}

属性设置代码

    @JSONField(format = "yyyy-MM-dd")    private Date aDDDate;

返回结果

请求接口后addDate字段返回的格式为2022-12-17 13:26:45,仍然为全局日期格式,并不设置JSONField后期望的2022-12-17格式

解决方案

统一扫描

系统启动时扫描对应基类的子类,通过反射获取标注了JSONField注解的字段并获取对应的format值

public class FastJsonUtil {    private static HashMap<String, String> dateMap = new HashMap();    public static void scanDate2Json(Class runtimeClass, List<String> extraPackageNameList) {        List<Class> filterClassList = new ArrayList<>();        filterClassList.add(BaseSystemObject.class);        List<Class<?>> scanClassList = new ArrayList<>();        if (!runtimeClass.getPackage().getName().equals(Application.class.getPackage().getName())) {            scanClassList.addAll(ScanUtil.getAllClassByPackageName(runtimeClass.getPackage(), filterClassList));        }        for (String packageName : extraPackageNameList) {            scanClassList.addAll(ScanUtil.getAllClassByPackageName(packageName, filterClassList));        }        for (Class clazz : scanClassList) {            List<Field> fs = Arrays.asList(clazz.getDeclaredFields());            for (Field field : fs) {                field.setAccessible(true);                if (field.getType() == Date.class) {                    JSONField jsonField = field.getAnnotation(JSONField.class);                    if (jsonField != null && !StringUtil.isEmpty(jsonField.format())) {                        dateMap.put(clazz.getName() + "|" + field.getName(), jsonField.format());                    }                }            }        }    }    public static boolean checkDate2Json(String key){        return dateMap.containsKey(key);    }    public static String getDate2JsonFormat(String key){        return dateMap.get(key);    }}

统一修改

实现fastjson的扩展过滤器ValueFilter进行序列化后的值修改,并注册到配置中去

public class FastJsonPropertyValueFilter implements ValueFilter {    @Override    public Object process(Object source, String name, Object value) {        String key = source.getClass().getName() + "|" + name;        if (value != null && FastJsonUtil.checkDate2Json(key)) {            String format = FastJsonUtil.getDate2JsonFormat(key);            DateFormat df = new SimpleDateFormat(format);            return df.format(value);        }        return value;    }}
public class WebConfig implements WebMvcConfigurer {    @Override    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {        //1.需要定义一个convert转换消息的对象;        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;        FastJsonConfig fastJsonConfig = new FastJsonConfig();        //全局指定了日期格式        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");        //指定json返回规则        fastJsonConfig.setSerializeFilters(new FastJsonPropertyValueFilter());        //3处理中文乱码问题        List<MediaType> fastMediaTypes = new ArrayList<>();        fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);        //4.在convert中添加配置信息.        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);        //5.将convert添加到converters当中.        converters.add(fastJsonHttpMessageConverter);    }}

到此,相信大家对“fastjson全局日期序列化设置导致JSONField失效如何解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: fastjson全局日期序列化设置导致JSONField失效如何解决

本文链接: https://lsjlt.com/news/347784.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • fastjson全局日期序列化设置导致JSONField失效如何解决
    本篇内容主要讲解“fastjson全局日期序列化设置导致JSONField失效如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“fastjson全局日期序列化设置导致JSONField失效如...
    99+
    2023-07-04
  • fastjson全局日期序列化设置导致JSONField失效问题解决方案
    目录问题描述使用版本全局设置代码属性设置代码返回结果解决方案统一扫描统一修改问题描述 fastjson通过代码指定全局序列化返回时间格式,导致使用JSONField注解标注属性的特殊...
    99+
    2023-01-02
    fastjson日期序列化设置 fastjson JSONField失效
  • FastJson踩坑:@JsonField在反序列化时失效的解决
    问题描述 一个对象(某个字段为枚举类型,为了不采用默认的序列化过程,用@JSONField指定了序列化器和反序列器,过程见旧博文),将其放到JSONArray中再序列化JSONArr...
    99+
    2024-04-02
  • @NonNull导致无法序列化如何解决
    这篇文章主要介绍“@NonNull导致无法序列化如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“@NonNull导致无法序列化如何解决”文章能帮助大家解决问题。@NonNull导致无法序列化的...
    99+
    2023-07-04
  • vue日期设置范围有默认值不生效如何解决
    这篇文章主要介绍了vue日期设置范围有默认值不生效如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue日期设置范围有默认值不生效如何解决文章都会有所收获,下面我们一起来看看吧。一、问题描述在 Vue.j...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作