java map中的null值处理

本文探讨了Mybatis在返回HashMap时遇到的null值问题,导致key消失的解决方案。同时,介绍了如何在Java中批量将Map中的null值转换为空字符串,并解析了SerializerFeature的配置含义以及GsonBuilder的相关方法。

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

目录

 

Mybatis返回HashMap时,某个字段值为null时,key消失的问题

如何将map中的null批量转换成“”

SerializerFeature 中的配置含义

GsonBuilder方法解释


Mybatis返回HashMap时,某个字段值为null时,key消失的问题

在mybatisConfig.xml文件中设置


<configuration>  
  <settings>  
  <!--解决,查询返回结果含null没有对应字段值问题-->  
  <setting name="callSettersOnNulls" value="true"/>  
  </settings>  
</configuration>

 

springboot待实现

 

如何将map中的null批量转换成“”

继承ObjectMapper类,重新序列化逻辑


package com.anran.projectmanage.util;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;

public class JsonDealUtils extends ObjectMapper {

    public JsonDealUtils() {
        super();
        this.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {


            @Override
            public void serialize(Object arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
                arg1.writeString("");
            }

        });
    }
}

 

使用方式

        List<Map<String,Object>> list = new ArrayList<>();
        Map<String,Object> map = new HashMap<>();
        map.put("name", null);
        map.put("age", null);
        Map<String,Object> map1 = new HashMap<>();
        map1.put("name", "anran");
        map1.put("age", null);
        list.add(map);
        list.add(map1);
        ObjectMapper s = new JsonDealUtils();

        try {
            return s.writeValueAsString(list);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return null;
        }

运行结果:

 

 

SerializerFeature 中的配置含义

package com.alibaba.fastjson.serializer;
/**
 * @author wenshao<szujobs@hotmail.com>
 */
public enum SerializerFeature {
    QuoteFieldNames,//输出key时是否使用双引号,默认为true 
    /**
     * 
     */
    UseSingleQuotes,//使用单引号而不是双引号,默认为false
    /**
     * 
     */
    WriteMapNullValue,//是否输出值为null的字段,默认为false 
    /**
     * 
     */
    WriteEnumUsingToString,//Enum输出name()或者original,默认为false
    /**
     * 
     */
    UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false
    /**
     * @since 1.1
     */
    WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null 
    /**
     * @since 1.1
     */
    WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null 
    /**
     * @since 1.1
     */
    WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null 
    /**
     * @since 1.1
     */
    WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null
    /**
     * @since 1.1
     */
    SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
    /**
     * @since 1.1
     */
    SortField,//按字段名称排序后输出。默认为false
    /**
     * @since 1.1.1
     */
    @Deprecated
    WriteTabAsSpecial,//把\t做转义输出,默认为false
    /**
     * @since 1.1.2
     */
    PrettyFormat,//结果是否格式化,默认为false
    /**
     * @since 1.1.2
     */
    WriteClassName,//序列化时写入类型信息,默认为false。反序列化是需用到
 
    /**
     * @since 1.1.6
     */
    DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false
 
    /**
     * @since 1.1.9
     */
    WriteSlashAsSpecial,//对斜杠'/'进行转义
 
    /**
     * @since 1.1.10
     */
    BrowserCompatible,//将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
 
    /**
     * @since 1.1.14
     */
    WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
 
    /**
     * @since 1.1.15
     */
    NotWriteRootClassName,//暂不知,求告知
 
    /**
     * @since 1.1.19
     */
    DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false 
 
    /**
     * @since 1.1.35
     */
    BeanToArray //暂不知,求告知
    ;
 
    private SerializerFeature(){
        mask = (1 << ordinal());
    }
 
    private final int mask;
 
    public final int getMask() {
        return mask;
    }
 
    public static boolean isEnabled(int features, SerializerFeature feature) {
        return (features & feature.getMask()) != 0;
    }
 
    public static int config(int features, SerializerFeature feature, boolean state) {
        if (state) {
            features |= feature.getMask();
        } else {
            features &= ~feature.getMask();
        }
 
        return features;
    }
}

 

 

GsonBuilder方法解释

 

setFieldNamingPolicy 设置序列字段的命名策略(UPPER_CAMEL_CASE,UPPER_CAMEL_CASE_WITH_SPACES,LOWER_CASE_WITH_UNDERSCORES,LOWER_CASE_WITH_DASHES)
addDeserializationExclusionStrategy 设置反序列化时字段采用策略ExclusionStrategy,如反序列化时不要某字段,当然可以采用@Expore代替。
excludeFieldsWithoutExposeAnnotation 设置没有@Expore则不序列化和反序列化
addSerializationExclusionStrategy 设置序列化时字段采用策略,如序列化时不要某字段,当然可以采用@Expore代替。
registerTypeAdapter 为某特定对象设置固定的序列和反序列方式,实现JsonSerializer和JsonDeserializer接口
setFieldNamingStrategy 设置字段序列和反序列时名称显示,也可以通过@Serializer代替
setPrettyPrinting 设置gson转换后的字符串为一个比较好看的字符串
setDateFormat 设置默认Date解析时对应的format格式

 

### 如何在Java中检查Map是否为空或包含null #### 检查Map是否为空 为了判断`Map`对象是否为空,可以调用其内置的`isEmpty()`方法。此方法返回布尔,如果映射不包含任何键-对,则返回`true`; 否则返回`false`[^1]。 ```java import java.util.HashMap; public class CheckEmpty { public static void main(String[] args) { HashMap<String, String> hashMap = new HashMap<>(); System.out.println("Is HashMap Empty? " + hashMap.isEmpty()); hashMap.put("key", "value"); System.out.println("Is HashMap Empty after adding elements? " + hashMap.isEmpty()); } } ``` #### 检查Map是否为null 对于检测整个`Map`实例本身是否为`null`,这属于基本的对象引用验证,在尝试访问之前应该先确认该变量不是`null`。可以通过简单的条件语句来实现这一点: ```java if (hashMap != null && !hashMap.isEmpty()) { // Map既不是null也不是empty } else { // 要么是null要么是empty } ``` #### 检测Map中的null键或 要找出`Map`内是否有`null`作为键或是关联到某个键上的,可迭代遍历所有的条目并单独测试每一个键和对应的: ```java for (Map.Entry<String, String> entry : hashMap.entrySet()) { if (entry.getKey() == null || entry.getValue() == null) { System.out.println("Found a key or value that is null."); break; } } ``` 或者更简洁的方式利用流(Stream API),它能提供一种更加函数式的风格来进行同样的操作: ```java boolean hasNullKeyOrValue = hashMap.entrySet().stream() .anyMatch(entry -> entry.getKey() == null || entry.getValue() == null); System.out.println(hasNullKeyOrValue ? "Contains null keys/values" : "No nulls found"); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值