vv0885 2024-02-11 12:34 采纳率: 0%
浏览 12
已结题

fastjson2-2.0.46解析时java空泛型对象如何解析为一对大括号

相关jar包版本

<properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.cloud.alibaba.version>2022.0.0.0</spring.cloud.alibaba.version>
        <spring.cloud.version>4.0.0</spring.cloud.version>
    </properties>
......
<!-- fastjson -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.46</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2-extension-spring5</artifactId>
            <version>2.0.46</version>
        </dependency>
......

FastJsonConfiguration相关代码

@Configuration
public class FastJsonConfiguration implements WebMvcConfigurer {
    @Bean
    public HttpMessageConverter<?> fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = fastJsonHttpMessageConverter.getFastJsonConfig();
        fastJsonConfig.setCharset(StandardCharsets.UTF_8);
        fastJsonConfig.setReaderFeatures(
                JSONReader.Feature.SupportSmartMatch,
                JSONReader.Feature.FieldBased,
                JSONReader.Feature.TrimString);

        fastJsonConfig.setWriterFeatures(
                JSONWriter.Feature.WriteLongAsString,
                JSONWriter.Feature.WriteNullListAsEmpty,
                JSONWriter.Feature.WriteNullStringAsEmpty,
               JSONWriter.Feature.WriteNullBooleanAsFalse,
               JSONWriter.Feature.NullAsDefaultValue,
                JSONWriter.Feature.PrettyFormat
                );

        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);
        List<MediaType> mediaTypeList = new ArrayList<>();
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypeList);

        return fastJsonHttpMessageConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(0, fastJsonHttpMessageConverter());
    }
}

Controller返回的泛型对象

.......
public class MyResult<T> {
    private final boolean result;
    private final String code;
    private final String msg;
    private final T body;
......
}

目前返回结果中,body为null时

{
    "body": null,
        "msg": "",
        "code": "",
    "result": true
}

期望返回

{
    "body": {},
        "msg": "",
        "code": "",
    "result": true
}
  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-11 12:35
    关注
    获得0.45元问题酬金

    引自免费微信小程序:皆我百晓生

    在Fastjson2中,要实现当body为null时返回空对象{}而非null,你需要自定义一个FastJsonConfig的处理器,并在序列化过程中处理空泛型对象。以下是修改后的代码示例:

    @Configuration
    public class FastJsonConfiguration implements WebMvcConfigurer {
    
        // ... 其他配置保持不变 ...
    
        @Bean
        public HttpMessageConverter<?> fastJsonHttpMessageConverter() {
            FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
            
            // 创建并配置FastJsonConfig
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setCharset(StandardCharsets.UTF_8);
            // 设置日期格式等其他配置
            fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
    
            // 自定义SerializerFeature来处理空泛型对象
            SerializerFeature[] serializerFeatures = new SerializerFeature[]{
                    SerializerFeature.WriteDateUseDateFormat,
                    SerializerFeature.WriteMapNullValue, // 为了写出null值(可选,根据需求)
                    SerializerFeature.PrettyFormat,
                    // 添加以下特性以处理空泛型对象
                    new SerializerFeature() {
                        @Override
                        public boolean isEnabled(SerializerFeatureContext context) {
                            // 判断当前字段是否是MyResult类中的body字段并且其值为null
                            if (context.getPropertyName().equals("body") && context.get(Object.class).equals(null)) {
                                return true;
                            }
                            return false;
                        }
    
                        @Override
                        public void writeBefore(SerializerFeatureContext context) throws IOException {
                            // 当满足条件时,写入一个空JSON对象
                            context.out.write("{}");
                            context.setWriteStopped(true); // 停止后续的序列化过程
                        }
                    }
            };
            fastJsonConfig.setSerializerFeatures(serializerFeatures);
    
            List<MediaType> mediaTypeList = new ArrayList<>();
            mediaTypeList.add(MediaType.APPLICATION_JSON);
            fastJsonHttpMessageConverter.setSupportedMediaTypes(mediaTypeList);
            fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    
            return fastJsonHttpMessageConverter;
        }
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(0, fastJsonHttpMessageConverter());
        }
    }
    

    上述代码创建了一个自定义的SerializerFeature,它会在序列化MyResult类的body字段且值为null时输出空JSON对象{}

    然而,Fastjson2可能没有提供直接设置特定字段为空对象的功能,因此这个解决方案可能需要额外的开发工作,或者考虑在业务层对返回结果进行预处理,确保body字段不为null而是返回一个空对象实例。

    请查阅Fastjson2官方文档以确认是否有更方便的方式来实现这一需求。若Fastjson2本身不支持这种精细化控制,则建议通过扩展或替换序列化逻辑来达到目的。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 2月19日
  • 创建了问题 2月11日

悬赏问题

  • ¥15 求购HI3519AV100开发板
  • ¥15 请问1553 RT怎么测试,没有BC有方法吗
  • ¥100 业务编程如何选择学习方向和内容?
  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 【有偿】调用DXGI截图初始化失败,提示0xf 887a0004
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复
  • ¥15 学校优化算法sbo和蚁群算法怎么结合