@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(包括 false0、空字符串等),该字段会出现在 JSON 中。

2. 作用和目的

  • 作用:控制 JSON 输出的紧凑性,减少不必要的数据传输。

    • 在实际应用中,null 值的字段通常对前端或客户端没有意义,返回这些字段可能会增加数据量、降低性能,甚至造成歧义(例如,前端可能误以为 null 是有意义的默认值)。
    • @JsonInclude(JsonInclude.Include.NON_NULL) 确保只返回有实际值(非 null)的字段,从而优化 JSON 的大小和清晰度。
  • 常见使用场景

    • REST API 返回响应时,避免返回大量 null 字段,保持 JSON 简洁。
    • DTO(如 AdminAdminDTO)设计时,专注于传输有意义的数据。

3. 与“没有被初始化或映射为非 null 值的字段”的关系

  • 在你的 AdminAdminDTO 中,@JsonInclude(JsonInclude.Include.NON_NULL) 应用在类级别:

    @JsonInclude(JsonInclude.Include.NON_NULL)
    public class AdminAdminDTO extends Admin {
        // 字段定义...
    }
    
  • 这意味着:

    • 如果某个字段(如 logologoMinbindNum 等)未被初始化(值保持默认 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 值。
    • 假设通过 setLogo("someValue") 设置了 logo
      adminAdminDTO.setLogo("someValue"); // logo 现在为 "someValue"(非 null)
      
      • 序列化后,JSON 会包含 "logo": "someValue"
  • 你的日志中的情况

    • 从你提供的 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}
      
    • 未返回的字段(如 logologoMinbindNumsubscribeNumactivation)可能是因为它们未被初始化(值为 null),被 @JsonInclude(JsonInclude.Include.NON_NULL) 过滤。
    • 返回的字段(如 fakeComparor: trueisVip: 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 的默认值是 0boolean 的默认值是 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 值,它们就会返回(除非被其他注解或配置过滤)。

在这里插入图片描述