JsonInclude注解

这篇具有很好参考价值的文章主要介绍了JsonInclude注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍

Java对象中使用JsonInclude注解来标记需要包含在JSON字符串中的属性,为实体类在接口序列化返回值时增加规则的注解

使用

注解增加在类名上时,对整个类生效;也可增加在字段上,此时只对该字段生效

注解规则

@JsonInclude注解中的规则有:

ALWAYS

ALWAYS为默认值,表示全部序列化,即默认返回全部字段,

@JsonInclude(JsonInclude.Include.ALWAYS)

NON_NULL

NON_NULL表示值为null就不序列化,即值为null的字段不返回,

@JsonInclude(JsonInclude.Include.NON_NULL)

注:1.当实例对象中有Optional或AtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null,用NON_NULL 不能使该字段不做序列化,此时应使用NON_ABSENT规则
2.Optional是java用来优雅处理空指针的一个特性

NON_ABSENT

NON_ABSENT可在实例对象中有Optional或AtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null时,也可使该字段不做序列化,同时可以排除值为null的字段,

@JsonInclude(JsonInclude.Include.NON_ABSENT)

NON_EMPTY

只有属性值不为null或者""(空字符串)的时候才会被包含在JSON字符串中

@JsonInclude(JsonInclude.Include.NON_EMPTY)

NON_DEFAULT

只有属性值不等于Java对象的默认值的时候才会被包含在JSON字符串中。

@JsonInclude(JsonInclude.Include.NON_DEFAULT)

CUSTOM

相对其他类型,CUSTOM略为复杂,这个值要配合valueFilter属性一起使用,在序列化的时候会执行CustomFilter中的的equals方法,该方法的入参就是字段的值,如果equals方法返回true,字段就不会被序列化,如果equals方法返回false时字段才会被序列化,即true时不返回,false时才返回

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = CustomFilter.class)
private String field;

static class CustomFilter {
   @Override
   public boolean equals(Object obj) {
       // 为null,或者不是字符串就返回true,即不返回该字段
       if(null == obj || !(obj instanceof String)) {
           return true;
       }

       // 长度大于2就返回true,意味着不被序列化
       return ((String) obj).length() > 2;
   }
}

测试代码:看其他博主的测试代码,都是用使用Controller的@ResponseBody注解测试的,但我感觉太麻烦,了解了@ResponseBody注解默认使用的也是jackson将Java对象转换为JSON格式,所以这里直接使用jackson来测试

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Getter;
import lombok.Setter;

@JsonInclude(JsonInclude.Include.ALWAYS)
//@JsonInclude(JsonInclude.Include.NON_DEFAULT)
//@Data
//@AllArgsConstructor
//@NoArgsConstructor
//@Builder
public class TestEntity {
    @Getter
    Long id;
    @Getter
    @Setter
    String name;
    String phone;

}

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

public static void main(String[] args) {
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        TestEntity testEntity_1 = new TestEntity();
        TestEntity testEntity_2 = new TestEntity();
        testEntity_2.setName("xiaowang");
        Gson gson = new Gson();
        System.out.println(objectMapper.writeValueAsString(testEntity_1));	//{"id":null,"name":null}
        System.out.println(objectMapper.writeValueAsString(testEntity_2));	//{"id":null,"name":"xiaowang"}
        System.out.println(gson.toJson(testEntity_1));	//{}
        System.out.println(gson.toJson(testEntity_2));	//{"name":"xiaowang"}
    } catch (JsonProcessingException e) {
        System.out.println("出错了");
    }
}

之前测试时踩了点坑,没有给实体写get方法,结果上面的 testEntity_1 打印一直为{},就很纳闷,但加了lombok的@Data注解后,又打印是{"id":null,"name":null,"phone",null},就很好奇为啥,以为是toString方法导致的,后来把@Data注解去掉重写了toString方法,结果打印结果还不对,后来才明白是get方法的原因,具体解释如下:

注意:当尝试将一个Java对象序列化为JSON时,只有那些具有getter方法的属性会被包含在JSON中,因为这些属性是可以从外部访问的。

而且这里测了一下jackson和Gson的序列化结果是否一致,结果发现不一样,原因可能是:Gson使用自定义的序列化方式,而ObjectMapper使用Java标准的序列化机制

如果有哪里说的不对,还请大佬留言指出,方便我好改正
参考博客文章来源地址https://www.toymoban.com/news/detail-680992.html

到了这里,关于JsonInclude注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java|注解之定义注解

    Java语言使用 @interface 语法来定义注解( Annotation ),它的格式如下:  注解的参数类似无参数方法,可以用 default 设定一个默认值(强烈推荐)。最常用的参数应当命名为 value 。 元注解 有一些注解可以修饰其他注解,这些注解就称为元注解 (meta annotation)。Java标准库已经

    2024年02月05日
    浏览(49)
  • 【Java基础】注解——自定义注解

    Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 比如我们常见的@Override和@Deprecated都是注解,注解可以加在类、方法、成员变量等上面,类似于给他们“ 打标签 \\\"。 public @interface 注解名{} 看起来和定义接口很相似只是多了一个@符号 接口: public interface 接口名

    2024年02月03日
    浏览(45)
  • Java注解——@Override注解(详解1)

    1、注解: 注解是 JDK 1.5 的特性 注解是给编译器或 JVM 看的,编译器或 JVM 可以根据注解来完成相应的功能。 或者叫注释类型,英文是:Annotation 注解Annotation是一种引用数据类型。编译之后也是生成xxx.class文件。 注解的语法格式: 【修饰符列表】 @interface 注解类型名{ } publ

    2024年02月03日
    浏览(47)
  • Java中的注解,自定义注解

    框架 = 注解 + 反射 + 设计模式 注解( Annotation )是从JDK5.0开始引入,以“@注解名”在代码中存在。 Annotation 可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明。还可以添加一些参数值,这些信息被保存在 Annotation 的 “name=valu

    2023年04月16日
    浏览(105)
  • java 元注解||自定义注解的使用

    1. @Retention注解 指定了标记的注解如何存储: RetentionPolicy.SOURCE,标记的注解仅保留在源代码级别,并被编译器忽略。 RetentionPolicy.CLASS,标记的注解在编译时由编译器保留,但被Java虚拟机(JVM)忽略。 RetentionPolicy.RUNTIME,标记的注解由JVM保留,以便运行时环境可以使用。 2. @Do

    2024年02月16日
    浏览(38)
  • JAVA学习-注解.基于注解的单元测试

            基于注解的单元测试是一种使用注解来简化和增强测试代码编写和执行的方法。在Java中,有多个基于注解的单元测试框架可供选择,包括JUnit、TestNG等。下面将对几个常见的基于注解的单元测试框架进行概述,并介绍它们的特点、使用方法以及与其他框架的比较。

    2024年04月28日
    浏览(36)
  • 【Kotlin】Kotlin 与 Java 互操作 ② ( @JvmField 注解字段给 Java | @JvmOverloads 注解修饰函数 | @JvmStatic 注解声明静态成员 )

    在 Java 中是 不能直接访问 Kotlin 中的字段 的 , 必须 调用相应的 Getter 和 Setter 方法 , 才能进行访问 ; 代码示例 : Kotlin 类 : 在 Kotlin 中声明的成员属性 , 默认就是 private 私有属性 , 默认为其生成了 Getter 和 Setter 方法 ; Java 类直接调用 : 在 Java 类中 , 不能直接调用 Kotlin 字段 ; 在

    2024年02月02日
    浏览(35)
  • Java注解源码分析,实现自定义注解通过反射获取

    JDK5.0 引入,可以通过反射机制动态获取,大量应用于java框架中 内置注解 @Override 重写父类方法时 @Deprecated 使用它存在风险,可能导致错误 可能在未来版本中不兼容 可能在未来版本中删除 一个更好和更高效的方案已经取代它 @SuppressWarnings 告诉编译器忽略指定的警告,不用在

    2024年02月03日
    浏览(43)
  • 详细分析Java中的@JsonFormat注解和@DateTimeFormat注解

    下文中涉及MybatisPlus的逻辑删除的知识,可看我之前这篇文章:详细讲解MybatisPlus实现逻辑删除 对应的Navicat设置数据库最新时间可看我这篇文章:Navicat 设置时间默认值(当前最新时间) 为了使 @JsonFormat 生效,项目必须引入 Jackson 库的相关依赖: (如果是springboot项目,可不

    2024年01月23日
    浏览(41)
  • Java AOP 通过注解实现切面及通过注解改变返回值

    学习过java的小伙伴都知道Spring的重要知识点之一就是AOP,AOP也就是切面编程,切面编程它能够帮助我们实现非侵入式的功能增强,解耦现有的业务逻辑和要新增的功能增强。 实际应用中的场景 事务管理、拦截器、日志处理、权限控制等。 AOP的增强方式 前置增强、后置增强

    2024年02月14日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包