栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

FastJson 给Long类型指定序列化类无效问题解决

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

FastJson 给Long类型指定序列化类无效问题解决

问题描述:

        给Long类型指定了序列化类,序列化类主要功能是在序列化时将Long类型变为String字符串类型,但是序列化之后发现还是无效。

全局序列化配置 :

 
    @Override
    public void configureMessageConverters(List> converters) {
        //fastjson的全局序列化方式
        configureFastJsonHttpMessageConverter(converters);
    }

    
    private void configureFastJsonHttpMessageConverter(List> converters) {
        // 定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //配置Content-Type
        List supportedMediaTypes = new ArrayList<>();
        supportedMediaTypes.add(MediaType.APPLICATION_JSON);
        supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
        supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
        supportedMediaTypes.add(MediaType.APPLICATION_PDF);
        supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
        supportedMediaTypes.add(MediaType.APPLICATION_XML);
        supportedMediaTypes.add(MediaType.IMAGE_GIF);
        supportedMediaTypes.add(MediaType.IMAGE_JPEG);
        supportedMediaTypes.add(MediaType.IMAGE_PNG);
        supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
        supportedMediaTypes.add(MediaType.TEXT_HTML);
        supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
        supportedMediaTypes.add(MediaType.TEXT_PLAIN);
        supportedMediaTypes.add(MediaType.TEXT_XML);
        fastConverter.setSupportedMediaTypes(supportedMediaTypes);
        // 添加fastjson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteNonStringKeyAsString
        );
        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(Long.class, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, com.alibaba.fastjson.serializer.ToStringSerializer.instance);
        serializeConfig.put(Date.class, new CustomDateSerializer());
        fastJsonConfig.setSerializeConfig(serializeConfig);
        // convert添加配置信息.
        fastConverter.setFastJsonConfig(fastJsonConfig);
        // 将convert添加到converters当中.
        converters.add(fastConverter);
    }

问题分析:

1、在全局序列化配置中给Long类型指定了序列化类,但是由于Long类型数据是放入了ArrayList对象中,再进行序列化,导致序列化出现问题。

调试代码:

    @GetMapping("/testJson2")
    public String testJson2() {
        List list = new ArrayList<>();
        list.add(1440931124753108994L);
        list.add(new Date());
        return JSON.toJSonString(list);
    } 

原因分析:

        由于ArrayList没有指定序列化类,序列化时会指定默认的序列化类ListSerializer。

                使用ListSerializer序列化类时,如果List里面有Integer或Long类型的数据,那么对应的Integer或Long类型的数据不会使用自己的序列化类,哪怕指定了序列化类都不会使用。

问题解决: 

        重新写一个ArrayList的序列化类并继承CollectionCodec,重写write()序列化方法,然后在全局序列化配置中给ArrayList类指定写好的序列化类即可。

        更详细的实现步骤请查看以下博客。

Spring Boot实现全局序列化配置(Jackson、FastJson)https://blog.csdn.net/qq_38974638/article/details/120513840

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号