json序列化时忽略值为null的字段2种方式实例

 更新时间:2023年10月13日 09:19:24   作者:程序猿不脱发2  
这篇文章主要给大家介绍了关于json序列化时忽略值为null的字段的2种方式,当对象中某个字段为null时,我们希望将对象转换成json时为null的字段不会被转换到json字符串,里面需要的朋友可以参考下

当一个对象里有些属性值为null 的不想参与json序列化时,比如打印日志等场景进行序列化,null字段会占用日志长度。 可以采用如下两种方式:

方法一:JsonInclude.Include.NON_NULL 注解

在类上面增加 @JsonInclude(JsonInclude.Include.NON_NULL)

示例:

//这个是类注解,表示该类实例化的对象里,值为null的字段不参与序列化
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class Person {
    private Long id;
    private String name;  
}
 public static void main(String[] args) {
        Person p1 = new Person();
        p1.setId(1L);
        p1.setName("test1");
        System.out.println("p1: " +JSONObject.toJSON(p1));
        Person p2 = new Person();
        p2.setId(1L);
        System.out.println("p2: " +JSONObject.toJSON(p2));
    }

输出:

p1: {"name":"test1","id":1}
p2: {"id":1}

方法2:自定义一个ObjectMapper

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

自定义一个JsonUtils工具类:

可以解析字符串,array, map等

@Slf4j
public class JsonUtils {
    private static final String EMPTY_JSON = "{}";
    private static final String EMPTY_ARRAY_JSON = "[]";
    private static final ObjectMapper MAPPER = new ObjectMapper();
    static {
        MAPPER.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
    }
    public static String toJSON(@Nullable Object obj) {
        if (obj == null) {
            return null;
        }
        try {
            return MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error("toJson error, ", e);
            throw new BusinessException(e.getMessage());
        }
    }
    public static <T> T parseObject(@Nullable String json, Class<T> valueType) {
        if (json == null) {
            return null;
        }
        try {
            return MAPPER.readValue(json, valueType);
        } catch (IOException e) {
            log.error("parse object error, ", e);
            throw new BusinessException(e.getMessage());
        }
    }
    public static <E, T extends Collection<E>> T parseArray(String json,
                                                            Class<? extends Collection> collectionType, Class<E> valueType) {
        if (StringUtils.isEmpty(json)) {
            json = EMPTY_ARRAY_JSON;
        }
        try {
            return MAPPER.readValue(json,
                    defaultInstance().constructCollectionType(collectionType, valueType));
        } catch (IOException e) {
            log.error("parseArray error, ", e);
            throw new BusinessException(e.getMessage());
        }
    }
    public static <T> List<T> parseArray(String json, Class<T> valueType) {
        return parseArray(json, List.class, valueType);
    }
    /**
     *
     */
    public static <K, V, T extends Map<K, V>> T parseMap(String json, Class<? extends Map> mapType,
                                                         Class<K> keyType, Class<V> valueType) {
        if (StringUtils.isEmpty(json)) {
            json = EMPTY_JSON;
        }
        try {
            return MAPPER.readValue(json,
                    defaultInstance().constructMapType(mapType, keyType, valueType));
        } catch (IOException e) {
            log.error("parseMap error, ", e);
            throw new BusinessException(e.getMessage());
        }
    }
    public static Map<String, Object> parseMap(String string) {
        return parseMap(string, Map.class, String.class, Object.class);
    }
}

测试

public static void main(String[] args) {
        Person p1 = new Person();
        p1.setId(1L);
        p1.setName("test1");
        System.out.println("p1: " +JsonUtils.toJSON(p1));
        Person p2 = new Person();
        p2.setId(1L);
        System.out.println("p2: " +JsonUtils.toJSON(p2));
    }
//输出:
// p1: {"id":1,"name":"test1"}
// p2: {"id":1}

总结 

到此这篇关于json序列化时忽略值为null的字段的文章就介绍到这了,更多相关json序列化忽略值为null字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Error occurred during initialization of VM Java虚拟机初始化失败问题

    解决Error occurred during initialization o

    这篇文章主要介绍了解决Error occurred during initialization of VM Java虚拟机初始化失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • mybatis中返回多个map结果问题

    mybatis中返回多个map结果问题

    这篇文章主要介绍了mybatis中返回多个map结果问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java 模拟数据库连接池的实现代码

    Java 模拟数据库连接池的实现代码

    这篇文章主要介绍了Java 模拟数据库连接池的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • SpringBoot中多环境yml的配置与打包问题

    SpringBoot中多环境yml的配置与打包问题

    这篇文章主要介绍了SpringBoot中多环境yml的配置与打包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot+Druid开启监控页面的实现示例

    SpringBoot+Druid开启监控页面的实现示例

    本文主要介绍了SpringBoot+Druid开启监控页面的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java HtmlEmail 邮件发送的简单实现代码

    Java HtmlEmail 邮件发送的简单实现代码

    下面小编就为大家带来一篇Java HtmlEmail 邮件发送的简单实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java实现在Word文档中添加批注的示例代码

    Java实现在Word文档中添加批注的示例代码

    在现代办公环境中,Word文档已成为信息传递和协作的重要载体,本教程将深入探讨如何利用Java实现Word文档批注的自动化添加,感兴趣的小伙伴可以了解下
    2025-10-10
  • java面向对象编程类的内聚性分析

    java面向对象编程类的内聚性分析

    高内聚、低耦合是软件设计中非常关键的概念。在面向对象程序设计中类的划分时,类的内聚性越高,其封装性越好,越容易复用
    2021-10-10
  • SpringBoot实现数据源动态切换的最佳姿势

    SpringBoot实现数据源动态切换的最佳姿势

    这篇文章主要为大家详细介绍一下SpringBoot实现数据源动态切换的最佳姿势,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Spring Boot 与 Tomcat 错误页面处理机制全面解析

    Spring Boot 与 Tomcat 错误页面处理机制全面解析

    本文给大家介绍Spring Boot 如何与内嵌 Tomcat 协作,实现高效、灵活的错误页面处理机制,通过分析核心源码,我们将揭示这一机制背后的设计哲学和实现细节,感兴趣的朋友跟随小编一起看看吧
    2024-12-12

最新评论