当前位置: 首页 > article >正文

Jackson库中JsonInclude的使用

简介

        JsonInclude是 Jackson 库(Java 中用于处理 JSON 数据的流行库)中的一个注解。它用于控制在序列化 Java 对象为 JSON 时,哪些属性应该被包含在 JSON 输出中。这个注解提供了多种策略来决定属性的包含与否,帮助减少不必要的数据传输,提高性能并且优化 JSON 数据的结构。

有几个默认策略:

策略介绍:

ALWAYS

        这是默认的包含策略。在使用JsonInclude.Include.ALWAYS时,无论 Java 对象中的属性值是什么状态,都会将其包含在序列化后的 JSON 数据中。例如,对于一个 POJO(Plain Old Java Object)类:

import com.fasterxml.jackson.annotation.JsonInclude;
class MyObject {
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private String name;
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private Integer age;
    // 构造函数、getter和setter方法省略
}

        当你将MyObject的一个实例序列化为 JSON 时,nameage这两个属性都会出现在 JSON 字符串中,即使namenull或者agenull。比如,如果namenull,序列化后的 JSON 可能是{"name":null,"age":null}。

NON_NULL

        采用JsonInclude.Include.NON_NULL策略时,只有属性值不为null的属性才会被包含在序列化后的 JSON 数据中。例如:

import com.fasterxml.jackson.annotation.JsonInclude;
class MyObject {
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String name;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer age;
    // 构造函数、getter和setter方法省略
}

        如果namenull,而age10,那么序列化后的 JSON 将是{"age":10}。这种策略可以有效减少 JSON 数据的大小,避免传输不必要的null值。

        这个可以用于给前端返回对象时,加在类上,就可以去掉不需要的空属性,这也就不用再新建类了,可以复用已有类。

NON_ABSENT

        这个策略在某些特定的场景下使用,比如处理一些可能存在 “缺席” 概念的数据结构。不过在标准的 Jackson 使用中,这个策略相对不太常见。它通常用于更复杂的对象层次结构中,当一个子对象被认为是 “缺席” 而不是null时,不包含该子对象相关的属性。

NON_EMPTY

        对于JsonInclude.Include.NON_EMPTY,当属性是集合类型(如ListSetMap等)或者字符串类型时,只有在集合不为空或者字符串长度大于 0 时,该属性才会被包含在 JSON 数据中。例如:

import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.ArrayList;
import java.util.List;
class MyObject {
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    private List<String> hobbies;
    // 构造函数、getter和setter方法省略
}

        如果hobbies是一个空的ArrayList,那么在序列化MyObject时,hobbies属性不会出现在 JSON 数据中。但如果hobbies包含元素,如["reading","swimming"],则会包含在 JSON 中,像{"hobbies":["reading","swimming"]}

NON_DEFAULT

        当使用JsonInclude.Include.NON_DEFAULT时,只有属性值与默认值不同的属性才会被包含在 JSON 数据中。对于基本数据类型,它们都有默认值(如int默认值是 0,boolean默认值是false等)。例如:

import com.fasterxml.jackson.annotation.JsonInclude;
class MyObject {
    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
    private int count;
    // 构造函数、getter和setter方法省略
}

        如果count的值为 0(int的默认值),序列化MyObject时,count属性不会出现在 JSON 数据中。但如果count5,则会包含在 JSON 中,如{"count":5}

CUSTOM

   JsonInclude.Include.CUSTOM允许你定义自己的包含规则。这通常需要实现自定义的过滤器或者使用 Jackson 提供的一些高级过滤机制。例如,你可以创建一个自定义的ValueFilter来决定哪些属性应该被包含,具体实现可能涉及实现接口并配置到ObjectMapper中,这是一种比较灵活但相对复杂的方式,用于处理特殊的序列化需求。

USE_DEFAULTS

        这个策略主要用于在继承场景或者一些复杂的配置中,恢复到默认的包含策略。它会按照 Jackson 库默认的方式来处理属性的包含,通常在覆盖了一些全局设置后,需要在某些特定情况下重新使用默认行为时使用。


http://www.kler.cn/a/412177.html

相关文章:

  • 基于Springboot的心灵治愈交流平台系统的设计与实现
  • Scrapy图解工作流程-cnblog
  • Cocos编辑器
  • QT6学习第四天 感受QT的文件编译
  • Oracle RAC的DB未随集群自动启动
  • 2024年最新版Java八股文复习
  • 使用 Vue.js 创建一个简单的待办事项应用
  • QT QVerticalSpacer控件 全面详解
  • 16 —— Webpack多页面打包
  • 企业OA管理系统:Spring Boot技术深度解析
  • 自研芯片逾十年,亚马逊云科技Graviton系列芯片全面成熟
  • 景联文科技:高质量数据采集标注服务引领AI革新
  • Spring Boot Web应用开发:数据访问
  • 短信发送业务
  • 0基础学前端系列 -- 深入理解 HTML 布局
  • DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等
  • 基于springboot停车场管理系统源码和论文
  • k8s删除网络组件错误
  • 实验3-2
  • QT实现 倒计时猜数字小游戏 QT5.12.3环境 C++实现
  • 【Threejs进阶教程-着色器篇】9.顶点着色器入门
  • 大语言模型LLM的微调代码详解
  • Flask项目中PostgreSQL与Elasticsearch的批量更新
  • LLM PPT Translator
  • 笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
  • BC-Linux8.6上面离线手动安装Docker引擎