@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.