SpringBoot项目Json中的空值处理,将null转为空字符串"",空list转为空数组等

本文介绍了一种使用FastJSON库处理Java应用中空值的方法,通过配置SerializerFeature实现了对不同类型的空值转换,例如将null转换为特定类型的默认值,如空字符串、空列表等。

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

本篇使用fastjson进行空值null处理

Jackson的请看:https://blog.youkuaiyun.com/qq_31183727/article/details/99539115

项目中之前用的null值转空串方法,将空list也转换为了"",不适合需求,之后在网上找的方法修改后,适用现在的需求,现在分享给大家。

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.List;

/**
 * 返回结果,null按类型转换为对应的默认值
 */
@Configuration
public class ResultConfig extends WebMvcConfigurerAdapter{
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                //List字段如果为null,输出为[],而非null
                SerializerFeature.WriteNullListAsEmpty,
                //是否输出值为null的字段,默认为false
                SerializerFeature.WriteMapNullValue,
                //字符串null返回空字符串
                SerializerFeature.WriteNullStringAsEmpty,
                //空布尔值返回false
                SerializerFeature.WriteNullBooleanAsFalse,
                //结果是否格式化,默认为false
                SerializerFeature.PrettyFormat);
        //格式化日期
        fastJsonConfig.setDateFormat("YYYY-MM-dd HH:mm:ss");
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(converter);
   }
}

下面是从别的博客找的一些SerializerFeature中的属性及含义


名称                                                                含义    
QuoteFieldNames     输出key时是否使用双引号,默认为true     
UseSingleQuotes     使用单引号而不是双引号,默认为false     
WriteMapNullValue     是否输出值为null的字段,默认为false     
WriteEnumUsingToString     Enum输出name()或者original,默认为false     
UseISO8601DateFormat     Date使用ISO8601格式输出,默认为false     
WriteNullListAsEmpty     List字段如果为null,输出为[],而非null     
WriteNullStringAsEmpty     字符类型字段如果为null,输出为”“,而非null     
WriteNullNumberAsZero     数值字段如果为null,输出为0,而非null     
WriteNullBooleanAsFalse     Boolean字段如果为null,输出为false,而非null     
SkipTransientField     如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true     
SortField     按字段名称排序后输出。默认为false     
WriteTabAsSpecial     把\t做转义输出,默认为false     不推荐
PrettyFormat     结果是否格式化,默认为false     
WriteClassName     序列化时写入类型信息,默认为false。反序列化是需用到     
DisableCircularReferenceDetect     消除对同一对象循环引用的问题,默认为false     
WriteSlashAsSpecial     对斜杠’/’进行转义     
BrowserCompatible     将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false     
WriteDateUseDateFormat     全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);     
DisableCheckSpecialChar     一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false     
NotWriteRootClassName     含义     
BeanToArray     将对象转为array输出     
WriteNonStringKeyAsString     Map<Integer,Stirng> 输出 key 默认为 Integer添加此属性,Integer 添加了 “”,变成字符型
NotWriteDefaultValue     将基础类型的默认值屏蔽     
BrowserSecure     含义     
IgnoreNonFieldGetter     含义     
WriteEnumUsingName     用枚举name()输出
--------------------- 
作者:孤天浪雨 
来源:优快云 
原文:https://blog.youkuaiyun.com/u010246789/article/details/52539576 

 

<think>好的,我现在需要解决用户的问题:如何在处理JSON通用结果时过滤掉字符串。首先,我得回忆一下用户提供的引用内容,看看有没有相关的信息。 用户提到了几个引用,其中引用[2]讨论了使用正则表达式或字符串替换去除JSON中的回车符。虽然问题不同,但方法可能有相似之处,比如处理特定字符。引用[3]提到处理特殊字符时的问题,比如HTML实体,但同样不直接涉及字符串过滤。引用[1]和[4]似乎和处理JSON中的特殊字符或数据转换有关,但可能不太相关。 接下来,我需要考虑不同编程语言中的处理方法,因为用户没有指定具体语言。常见的语言有Java、Python、JavaScript等,可能需要分别给出解决方案。 对于Java,可以使用Jackson库。在序列化时,可以通过配置ObjectMapper来排除字符串。例如,设置SerializationFeature.WRITE_EMPTY_JSON_ARRAYS和WRITE_NULL_MAP_VALUES,不过可能需要使用注解@JsonInclude(Include.NON_EMPTY)在类或字段级别。此外,自定义过滤器也可能有效,如使用SimpleBeanPropertyFilter。 在JavaScript中,处理JSON对象时,可以在序列化前遍历对象属性,删除字符串。比如使用JSON.stringify的replacer函数,或者在遍历时检查属性值是否为"",然后删除它们。 Python的话,可以使用json模块,在序列化前递归清理字典中的字符串。例如定义一个函数,遍历字典的键值对,排除值为字符串的项,然后递归处理嵌套结构。 另外,通用的思路可能是在生成JSON数据前,先清理数据源中的空值,或者在解析JSON处理。不过用户可能更倾向于在序列化时处理,以避免额外步骤。 还需要注意,不同的库和语言可能有不同的配置方式,需要确保正确应用这些配置。比如Jackson的注解或ObjectMapper配置,JavaScript中的replacer函数的使用方法等。 可能的相关问题包括如何处理其他类型的空值(如null),或者在不同编程环境下是否有其他过滤方法。此外,性能考虑也是一个点,比如在数据量大的情况下,哪种方法更高效。 总结一下,解决方案应涵盖几种主要语言,并引用用户提供的参考资料中的相关方法,比如使用字符串替换或正则表达式,但需要调整到过滤字符串的场景。</think>在处理JSON数据时过滤字符串的通用方法可分为语言相关实现和预处理策略,以下是具体解决方案: ### 一、编程语言实现方案 1. **Java方案(使用Jackson库)** ```java // 全局配置过滤字符串 ObjectMapper mapper = new ObjectMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); // 类级别注解 @JsonInclude(JsonInclude.Include.NON_EMPTY) public class MyData { private String name = ""; // 字符串将被过滤 } ``` 2. **JavaScript方案** ```javascript // 使用JSON.stringify的replacer参数 const filteredJSON = JSON.stringify(data, (key, value) => { return value === "" ? undefined : value; }); // 遍历删除空值 function cleanJSON(obj) { Object.keys(obj).forEach(key => { if (obj[key] === "") delete obj[key] else if (typeof obj[key] === 'object') cleanJSON(obj[key]) }) } ``` 3. **Python方案** ```python import json def filter_empty(data): if isinstance(data, dict): return {k: filter_empty(v) for k, v in data.items() if v != ""} elif isinstance(data, list): return [filter_empty(item) for item in data if item != ""] else: return data clean_data = filter_empty(original_data) json_str = json.dumps(clean_data) ``` ### 二、通用预处理策略 1. **数据源清洗** 在生成JSON数据前遍历数据结构,递归删除所有字符串值,适用于任何语言场景 2. **正则表达式处理**(需谨慎使用) 对已生成的JSON字符串进行二次处理: ```javascript // 替换"key": ""模式 jsonStr.replace(/"[^"]+":\s*""/g, '') ``` *注意:需处理嵌套结构和数组边界情况[^2]* ### 三、框架集成方案 Spring Boot项目可配置全局过滤: ```yaml spring: jackson: default-property-inclusion: non_empty ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值