@JsonCreator 指定构造方法、工厂方法

@JsonCreator 指定构造方法、工厂方法

@JsonCreator 能够指定反序列化时的构造方法或工厂方法,需要配合 @JsonProperty 使用。这通常用于 JSON 与对象的字段不完全匹配时、不可变对象。有以下规则:

  • 当有多个参数时,必须用 @JsonProperty 注解每个参数。
  • 只有一个参数时,可以省略 @JsonProperty

构造方法

public class JsonCreatorConstructorExample {

    public static void main(String[] args) throws IOException {
        System.out.println("-- writing --");
        Employee employee = new Employee("Trish", "Admin");
        //convert to 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) {
            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 + '\'' +
                    '}';
        }
    }
}
-- writing --
'constructor invoked'
{"name":"Trish","dept":"Admin"}
-- reading --
'constructor invoked'
Employee{name='Trish', dept='Admin'}

工厂方法

public class JsonCreatorFactoryMethodExample {
    public static void main(String[] args) throws IOException {
        System.out.println("-- writing --");
        Employee employee = Employee.createEmployee("Trish", "Admin");
        //convert to 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 + '\'' +
                    '}';
        }
    }
}
-- writing --
'factory method invoked'
{"name":"Trish","dept":"Admin"}
-- reading --
'factory method invoked'
Employee{name='Trish', dept='Admin'}

原文链接

Jackson JSON - Using @JsonCreator to define constructors or factory methods for deserialization.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值