SpringBoot项目Json中的空值处理

将null转为空字符串"",空list转为空数组等

自定义信息转化器

官方推荐直接实现WebMvcConfigurer或者直接继承WebMvcConfigurationSupport,重写configureMessageConverters方法

方式一:实现WebMvcConfigurer接口(推荐)

方式二:继承WebMvcConfigurationSupport类,会导致自动配置失效

1. 使用fastjson进行空值null处理

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                // 结果是否格式化,默认为false
                SerializerFeature.PrettyFormat,
                // 是否输出值为null的字段,默认为false
                SerializerFeature.WriteMapNullValue,
                // 字符类型字段如果为null,输出为”“,而非null
                SerializerFeature.WriteNullStringAsEmpty,
                // Boolean字段如果为null,输出为false,而非null
                SerializerFeature.WriteNullBooleanAsFalse,
                // 数值字段如果为null,输出为0,而非null
                SerializerFeature.WriteNullNumberAsZero,
                // 消除对同一对象循环引用的问题,默认为false
                SerializerFeature.DisableCircularReferenceDetect,
                // List字段如果为null,输出为[],而非null
                SerializerFeature.WriteNullListAsEmpty);
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(0, 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()输出

2. 使用Jackson进行空值null处理

public class JacksonHttpMessageConverter extends MappingJackson2HttpMessageConverter {
    /**
     * 处理数组类型的null值
     */
    public class NullArrayJsonSerializer extends JsonSerializer<Object> {

        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            if (value == null) {
                jsonGenerator.writeStartArray();
                jsonGenerator.writeEndArray();
            }
        }
    }


    /**
     * 处理字符串类型的null值
     */
    public class NullStringJsonSerializer extends JsonSerializer<Object> {

        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeString(StringUtils.EMPTY);
        }
    }

    /**
     * 处理数字类型的null值
     */
    public class NullNumberJsonSerializer extends JsonSerializer<Object> {

        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeNumber(0);
        }
    }

    /**
     * 处理布尔类型的null值
     */
    public class NullBooleanJsonSerializer extends JsonSerializer<Object> {

        @Override
        public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            jsonGenerator.writeBoolean(false);
        }
    }


    public class MyBeanSerializerModifier extends BeanSerializerModifier {

        @Override
        public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
            //循环所有的beanPropertyWriter
            for (Object beanProperty : beanProperties) {
                BeanPropertyWriter writer = (BeanPropertyWriter) beanProperty;
                //判断字段的类型,如果是array,list,set则注册nullSerializer
                if (isArrayType(writer)) {
                    //给writer注册一个自己的nullSerializer
                    writer.assignNullSerializer(new NullArrayJsonSerializer());
                } else if (isNumberType(writer)) {
                    writer.assignNullSerializer(new NullNumberJsonSerializer());
                } else if (isBooleanType(writer)) {
                    writer.assignNullSerializer(new NullBooleanJsonSerializer());
                } else if (isStringType(writer)) {
                    writer.assignNullSerializer(new NullStringJsonSerializer());
                }
            }
            return beanProperties;
        }

        /**
         * 是否是数组
         */
        private boolean isArrayType(BeanPropertyWriter writer) {
            Class<?> clazz = writer.getType().getRawClass();
            return clazz.isArray() || Collection.class.isAssignableFrom(clazz);
        }

        /**
         * 是否是string
         */
        private boolean isStringType(BeanPropertyWriter writer) {
            Class<?> clazz = writer.getType().getRawClass();
            return CharSequence.class.isAssignableFrom(clazz) || Character.class.isAssignableFrom(clazz);
        }


        /**
         * 是否是int
         */
        private boolean isNumberType(BeanPropertyWriter writer) {
            Class<?> clazz = writer.getType().getRawClass();
            return Number.class.isAssignableFrom(clazz);
        }

        /**
         * 是否是boolean
         */
        private boolean isBooleanType(BeanPropertyWriter writer) {
            Class<?> clazz = writer.getType().getRawClass();
            return clazz.equals(Boolean.class);
        }

    }

    JacksonHttpMessageConverter() {
        getObjectMapper().setSerializerFactory(getObjectMapper().getSerializerFactory().withSerializerModifier(new MyBeanSerializerModifier()));
    }
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //调用父类的配置
        converters.add(0, new JacksonHttpMessageConverter());
    }
}

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言,可以使用第三方库来读取和处理JSON数据。例如,cJSON库提供了用于检查JSON对象的函数。 代码示例: ``` #include <cjson/cJSON.h> // ... cJSON *json = cJSON_Parse(json_string); if (cJSON_IsNull(json)) { // Handle error } cJSON *value = cJSON_GetObjectItemCaseSensitive(json, "key"); if (cJSON_IsNull(value)) { // "key" is not present in the JSON object or its value is null } // ... cJSON_Delete(json); ``` 上面的代码使用了cJSON_Parse函数来将JSON字符串解析为cJSON对象,并使用cJSON_IsNull函数来检查解析后的对象是否为。然后使用cJSON_GetObjectItemCaseSensitive函数获取JSON对象的某个,并使用cJSON_IsNull函数检查该是否为。 ### 回答2: 在JSON通常表示为null。要判断JSON,可以使用以下几种方法: 1. 使用语言自带的JSON解析库:大部分编程语言都提供了JSON解析库,可以使用该库将JSON字符串解析为对象或字典。然后,可以使用语言提供的方法来判断键对应的是否为null。 例如,在Python,可以使用json模块将JSON字符串解析为字典,然后使用if语句判断是否为null: ```python import json json_str = '{"key": null}' json_data = json.loads(json_str) if json_data['key'] is None: print('为null') else: print('不为null') ``` 2. 使用正则表达式匹配:可以使用正则表达式匹配JSON字符串,查找键为null的情况。例如,可以使用以下正则表达式来匹配JSON字符串: ```regex \"key\"\s*:\s*null ``` 3. 手动解析JSON字符串:如果不想使用语言自带的JSON解析库,也可以手动解析JSON字符串。可以查找键是否为null来判断。然而,这种方法相对繁琐,并且容易出错。 无论使用哪种方法,都要注意JSON字符串的正确格式,以及遵守JSON的语法规则。 ### 回答3: 在JSON通常表示为null。你可以通过以下方法来判断JSON: 1. 使用if语句:使用if语句来检查JSON是否为null。例如: ```python import json data = '{"key": null}' json_data = json.loads(data) if json_data['key'] is None: print("JSON") ``` 2. 使用try-except语句:使用try-except语句来捕获JSON。例如: ```python import json data = '{"key": null}' json_data = json.loads(data) try: value = json_data['key'] if value is None: print("JSON") except KeyError: print("JSON不存在该键") ``` 3. 使用 isinstance() 函数:使用isinstance()函数来判断JSON是否为None。例如: ```python import json data = '{"key": null}' json_data = json.loads(data) if isinstance(json_data['key'], type(None)): print("JSON") ``` 以上是判断JSON的方法之一。根据你的需求和编程语言的不同,可能还有其他方法来判断JSON

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值