@JsonInclude(JsonInclude.Include.NON_NULL)表示在序列化时,仅包含非 null 的字段(即排除值为 null 的字段)。
文章目录
1. @JsonInclude(JsonInclude.Include.NON_NULL)
的定义
-
@JsonInclude
:这是 Jackson 库(com.fasterxml.jackson.annotation.JsonInclude
)提供的一个注解,用于控制在序列化(将 Java 对象转换为 JSON)时哪些属性应该包含在 JSON 中。它帮助你根据特定条件排除某些字段,比如当字段值为 null 或满足某个特定条件时,可以不将该字段包括在生成的 JSON 中。 -
JsonInclude.Include.NON_NULL
:这是一个枚举值,表示在序列化时,仅包含非null
的字段(即排除值为null
的字段)。
注解语法:
@JsonInclude(JsonInclude.Include.NON_NULL)
public class AdminAdminDTO extends Admin {
// 字段定义...
}
- 当
AdminAdminDTO
类或其字段上标记了@JsonInclude(JsonInclude.Include.NON_NULL)
,Jackson 在将对象序列化为 JSON 时,会检查每个字段的值:- 如果字段值为
null
,该字段不会出现在生成的 JSON 中。 - 如果字段值非
null
(包括false
、0
、空字符串等),该字段会出现在 JSON 中。
- 如果字段值为
2. 作用和目的
-
作用:控制 JSON 输出的紧凑性,减少不必要的数据传输。
- 在实际应用中,
null
值的字段通常对前端或客户端没有意义,返回这些字段可能会增加数据量、降低性能,甚至造成歧义(例如,前端可能误以为null
是有意义的默认值)。 -
@JsonInclude(JsonInclude.Include.NON_NULL)
确保只返回有实际值(非null
)的字段,从而优化 JSON 的大小和清晰度。
- 在实际应用中,
-
常见使用场景:
- REST API 返回响应时,避免返回大量
null
字段,保持 JSON 简洁。 - DTO(如
AdminAdminDTO
)设计时,专注于传输有意义的数据。
- REST API 返回响应时,避免返回大量
3. 与“没有被初始化或映射为非 null
值的字段”的关系
-
在你的
AdminAdminDTO
中,@JsonInclude(JsonInclude.Include.NON_NULL)
应用在类级别:@JsonInclude(JsonInclude.Include.NON_NULL) public class AdminAdminDTO extends Admin { // 字段定义... }
-
这意味着:
- 如果某个字段(如
logo
、logoMin
、bindNum
等)未被初始化(值保持默认null
),或从Admin
映射时值为null
,它不会被序列化到 JSON 中,因此不会返回给前端。 - 如果字段被显式设置了一个非
null
值(例如通过set
方法或JSON.parseObject
映射),它会出现在 JSON 中。
- 如果某个字段(如
-
示例:
- 假设
AdminAdminDTO
中的logo
字段未被设置(logo = null
):private String logo; // 默认值为 null
- 序列化后,JSON 中不会包含
"logo": null
,因为@JsonInclude(JsonInclude.Include.NON_NULL)
过滤了null
值。
- 序列化后,JSON 中不会包含
- 假设通过
setLogo("someValue")
设置了logo
:adminAdminDTO.setLogo("someValue"); // logo 现在为 "someValue"(非 null)
- 序列化后,JSON 会包含
"logo": "someValue"
。
- 序列化后,JSON 会包含
- 假设
-
你的日志中的情况:
- 从你提供的
AdminAdminDTO
JSON 日志中:{"communityLinkEditor":false,"copywritingEditor":false,"createdDate":1677778199000,"customerEditor":false,"display":0,"examEditor":false,"fakeComparor":true,"fakeRegistrationEditor":false,"firstLogin":0,"id":7,"industryStandardEditor":false,"inviterId":3,"lastLoginTime":1740132157386,"lastModifiedDate":1740131560000,"level":1,"logisticsCalculationEditor":false,"mail":"kxqd@tamoe.top","materialInspirationer":false,"nickname":"13524972741","pageAuditEditor":false,"password":"$2a$10$F6eMnw0AMN9vQJ9k6Ro1ZOSpvx.qqZAh0AM5bXXea562P5NaLopV2","passwordAttemptCount":0,"phone":"13524972741","pid":1,"promotionRegistrationEditor":false,"rank":0,"remark":"公司内 陈皖秋工作手机号","role":"ROLE_COMPANY_SUPER","score":27104,"status":1,"synergyEditor":false,"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiI3Iiwicm9sZSI6IlJPTEVfQ09NUEFOWV9TVVBFUiIsImV4cCI6MTc0MDIxODU1NywidXNlck5hbWUiOiIxMzUyNDk3Mjc0MSIsInR5cGUiOiJhZG1pbiIsImlhdCI6MTc0MDEzMjE1N30.rDXs9PEdc9xH4UamaRHjbPIeWZUF0Y3D2y3efZAHD5o","updatePasswordTime":1682518558000,"username":"13524972741","vip":true}
- 未返回的字段(如
logo
、logoMin
、bindNum
、subscribeNum
、activation
)可能是因为它们未被初始化(值为null
),被@JsonInclude(JsonInclude.Include.NON_NULL)
过滤。 - 返回的字段(如
fakeComparor: true
、isVip: true
)是因为它们被显式设置了非null
值(通过set
方法或JSON.parseObject
映射)。
- 从你提供的
4. 其他 JsonInclude.Include
选项
@JsonInclude
支持多种 Include
选项,影响字段的序列化行为:
-
JsonInclude.Include.ALWAYS
(默认):总是序列化所有字段(包括null
)。 -
JsonInclude.Include.NON_NULL
(当前使用):仅序列化非null
的字段。 -
JsonInclude.Include.NON_EMPTY
:仅序列化非空字段(null
、空字符串""
、空集合[]
等都被排除)。 -
JsonInclude.Include.NON_DEFAULT
:仅序列化与默认值不同的字段(例如,int
的默认值是0
,boolean
的默认值是false
)。
5. 总结
-
@JsonInclude(JsonInclude.Include.NON_NULL)
的意思:在序列化AdminAdminDTO
时,仅包含非null
的字段,排除值为null
的字段。这确保 JSON 输出紧凑,避免返回无意义的数据。 -
“没有被初始化或映射为非
null
值的字段”:如果某个字段未被初始化(保持默认null
)或从Admin
映射时值为null
,它不会被序列化到 JSON 中,因此不会返回给前端。这是@JsonInclude(JsonInclude.Include.NON_NULL)
的直接效果。 -
是否有
set
方法的影响:字段是否返回给前端不完全取决于是否有set
方法,而取决于字段是否有 getter/setter、是否被初始化为非null
值,以及序列化配置(如@JsonInclude
)。在AdminAdminDTO
中,所有字段都有 getter 和 setter,因此只要被初始化或映射为非null
值,它们就会返回(除非被其他注解或配置过滤)。
上一篇: 几秒钟就充满电!科学
下一篇: 暂无数据