首页 > 其他分享 >深入理解Jackson的@JsonCreator注解

深入理解Jackson的@JsonCreator注解

时间:2024-11-16 15:19:35浏览次数:3  
标签:Jackson String dept JsonCreator employee Employee 注解 name

在Java的JSON处理库中,Jackson无疑是最流行的选择之一。它提供了强大的数据绑定功能,允许开发者轻松地在Java对象和JSON数据之间进行转换。在处理不可变对象或者需要自定义反序列化逻辑时,@JsonCreator注解显得尤为重要。本文将通过实例深入探讨@JsonCreator注解的使用,包括其在构造函数和工厂方法中的应用。

@JsonCreator注解简介

@JsonCreator注解可以用于构造函数或工厂方法,用于将传入的JSON属性映射到构造函数/工厂方法的参数。此注解仅在反序列化期间使用,对于不可变对象尤其有用。

使用@JsonCreator注解的实例

在构造函数上使用@JsonCreator

首先,我们来看一个使用@JsonCreator注解在构造函数上的例子。在这个例子中,我们定义了一个Employee类,该类包含两个属性:namedept。我们使用@JsonCreator注解来指定构造函数,以便Jackson在反序列化JSON时能够正确地创建Employee对象。

public class JsonCreatorConstructorExample {
    public static void main(String[] args) throws IOException {
        System.out.println("-- writing --");
        Employee employee = new Employee("Trish", "Admin");
        // 转换为json
        String jsonString = toJson(employee);
        System.out.println(jsonString);
        System.out.println("-- reading --");
        Employee e = toEmployee(jsonString);
        System.out.println(e);
    }
    private static Employee toEmployee(String jsonData) throws IOException {
        ObjectMapper om = new ObjectMapper();
        return om.readValue(jsonData, Employee.class);
    }
    private static String toJson(Employee employee) throws IOException {
        ObjectMapper om = new ObjectMapper();
        return om.writeValueAsString(employee);
    }
    private static class Employee {
        private String name;
        private String dept;
        @JsonCreator
        public Employee(@JsonProperty("name") String name, @JsonProperty("dept") String dept) {
            System.out.println("'constructor invoked'");
            this.name = name;
            this.dept = dept;
        }
        public String getName() {
            return name;
        }
        public String getDept() {
            return dept;
        }
        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + name + '\'' +
                    ", dept='" + dept + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们首先创建了一个Employee对象,并将其转换为JSON字符串。然后,我们使用ObjectMapperreadValue方法将JSON字符串反序列化为Employee对象。注意,@JsonCreator注解确保了正确的构造函数被调用。

在工厂方法上使用@JsonCreator

除了在构造函数上使用@JsonCreator注解,我们还可以在工厂方法上使用它。这种方式在创建对象时提供了更大的灵活性,尤其是当对象的创建过程比较复杂或者需要重用现有对象时。

public class JsonCreatorFactoryMethodExample {
    public static void main(String[] args) throws IOException {
        System.out.println("-- writing --");
        Employee employee = Employee.createEmployee("Trish", "Admin");
        // 转换为json
        String jsonString = toJson(employee);
        System.out.println(jsonString);
        System.out.println("-- reading --");
        Employee e = toEmployee(jsonString);
        System.out.println(e);
    }
    private static Employee toEmployee(String jsonData) throws IOException {
        ObjectMapper om = new ObjectMapper();
        return om.readValue(jsonData, Employee.class);
    }
    private static String toJson(Employee employee) throws IOException {
        ObjectMapper om = new ObjectMapper();
        return om.writeValueAsString(employee);
    }
    private static class Employee {
        private String name;
        private String dept;
        @JsonCreator
        public static Employee createEmployee(@JsonProperty("name") String name,
                                              @JsonProperty("dept") String dept) {
            System.out.println("'factory method invoked'");
            Employee employee = new Employee();
            employee.name = name;
            employee.dept = dept;
            return employee;
        }
        public String getName() {
            return name;
        }
        public String getDept() {
            return dept;
        }
        @Override
        public String toString() {
            return "Employee{" +
                    "name='" + name + '\'' +
                    ", dept='" + dept + '\'' +
                    '}';
        }
    }
}

在这个例子中,我们定义了一个静态工厂方法createEmployee,并使用@JsonCreator注解来指定它。这种方式允许我们在反序列化时调用工厂方法来创建Employee对象。

项目依赖和技术栈

在本例中,我们使用了以下依赖和技术:

  • jackson-databind 2.9.3:Jackson的核心数据绑定功能库。
  • JDK 9:Java开发工具包。
  • Maven 3.3.9:项目构建和依赖管理工具。

通过上述实例,我们可以看到@JsonCreator注解在处理JSON数据和Java对象之间的转换时的强大功能。无论是在构造函数还是工厂方法上使用,它都能提供灵活且强大的自定义反序列化能力。

标签:Jackson,String,dept,JsonCreator,employee,Employee,注解,name
From: https://blog.csdn.net/m0_62153576/article/details/143800179

相关文章

  • 7.Java 注解和元注解(三种注解、四种元注解)
    一、注解概述注解也被称为元数据,用于修饰包、类、方法等数据信息和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息在JavaSE中,注解使用的目的比较简单,例如标记过时的功能,忽略警告等JavaEE中注解会充当更加重要的角色二、三种注......
  • JPA 注解只能用于标记实体类及其与数据库表之间的关系吗?对数据库表并没有什么实际影响
    JPA注解的主要作用确实是用于标记实体类及其与数据库表之间的关系,但它们在数据库层面上也会产生实际影响。具体来说,JPA注解不仅用于对象-关系映射(ORM),而且会影响数据库的结构和行为。以下是一些关键点,说明JPA注解如何对数据库表产生实际影响:1.生成数据库结构使用JPA时,可以......
  • 自定义注解进行数据脱敏
    前言有些时候,我们可能对输出的某些字段要做特殊的处理在输出到前端,比如:身份证号,电话等信息,在前端展示的时候我们需要进行脱敏处理,这时候通过自定义注解就非常的有用了。在Jackson中要自定义注解,我们可以通过@JacksonAnnotationsInside注解来实现,如下示例:一、自定义注解import......
  • @Around() 和 @Pointcut()注解的区别
    1. @Around 注解@Around是一种环绕通知(AroundAdvice),它允许你在目标方法执行前后都执行一些逻辑。这意味着你可以在方法调用之前、之后甚至在方法抛出异常时执行特定的逻辑。示例@Around("@annotation(myLock)")publicObjectaroundAdvice(ProceedingJoinPointjoinPoi......
  • 深入理解Spring框架中的@Async注解实现异步任务
    目录1.引言2.环境准备3.启用异步支持4.创建异步任务5.调用异步任务6.运行应用7.使用@Async需要注意的地方8.结论在现代Web应用中,异步任务的执行变得越来越重要。Spring框架提供了强大的@Async注解,可以帮助开发者轻松实现异步任务。本文将详细介绍如何在Sprin......
  • @Lazy注解解决循环依赖
    @Lazy是Spring框架中的一个注解,用于延迟一个bean的初始化,直到它第一次被使用。在默认情况下,Spring容器会在启动时创建并初始化所有的单例bean。这意味着,即使某个bean直到很晚才被使用,或者可能根本不被使用,它也会在应用启动时被创建。@Lazy注解就是用来改变这种行为的。也就是......
  • 【Java】自定义注解的使用
    什么是注解java中的,注解分为两种,元注解和自定义注解,类似于公理和定理的关系。我们常用一些注解:@Autowired、@Override等都是自定义注解。在JAVA中如何实现自定义注解?@interface关键字我们想定义一个自己的注解需要使用@interface来定义。//元注解@Target(ElementType.ME......
  • 深入理解JUnit注解:从入门到最佳实践
    深入理解JUnit注解:从入门到最佳实践一、JUnit注解基础概览1.五大核心注解JUnit提供了五个最基本也是最常用的注解:@Test@Before@After@BeforeClass@AfterClass让我们通过一个完整的示例来了解这些注解:publicclassBankAccountTest{privatestaticDatabaseConn......
  • MyBatis如何关闭一级缓存(分注解和xml两种方式)
    @目录问题:为什么有缓存什么场景下必须需要关闭一级缓存关闭一级缓存方法(针对使用MyBatis场景)第1种:注解形式(可指定仅仅某个Mapper关闭注解)第2种:sql动态拼接传入的随机数问题:为什么有缓存mybatis默认开启一级缓存什么场景下必须需要关闭一级缓存场景:执行2次相同sql,但是第一次......
  • 解锁Java编程新高度!用validate注解做校验,让你的代码更高效、更安全!
    在Java中,@Valid注解通常用于验证对象的属性。它通常与Spring框架一起使用,以自动触发对JavaBean的验证。以下是如何使用@Valid注解进行校验的详细步骤和示例代码:1.添加依赖首先,确保你的项目中包含了SpringBoot的starter-web依赖,因为我们需要用到Spring的验证功能。<depend......