@ConstructorProperties
不是 Jackson 的注解,它位于 java.beans
包中。它的用法类似 @JsonCreator
与 @JsonProperty
的组合,也是用于指定反序列化时的构造方法。
public class Employee {
private String name;
private String dept;
@ConstructorProperties({"name", "dept"})
public Employee(String name, String dept) {
System.out.println("Constructor invoked");
//Java 9 StackWalker to find out the caller
System.out.println("caller: " + StackWalker.getInstance(
StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass());
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 + '\'' +
'}';
}
}
public class ConstructorPropertiesExample {
public static void main(String[] args) throws IOException {
System.out.println("-- serializing --");
Employee employee = new Employee("Trish", "Admin");
//convert to json
String jsonString = toJson(employee);
System.out.println("serialized json: " + jsonString);
System.out.println("-- deserializing --");
Employee e = toEmployee(jsonString);
System.out.println("deserialized object: " + 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);
}
}
-- serializing --
Constructor invoked
caller: class org.example.c13.ConstructorPropertiesExample
serialized json: {"name":"Trish","dept":"Admin"}
-- deserializing --
Constructor invoked
caller: class com.fasterxml.jackson.databind.introspect.AnnotatedConstructor
deserialized object: Employee{name='Trish', dept='Admin'}
原文链接
Jackson JSON - Using @ConstructorProperties to deserialize JSON via constructor