Ngoài các câu trả lời khác, @JsonProperty
chú thích thực sự quan trọng nếu bạn sử dụng @JsonCreator
chú thích trong các lớp không có hàm tạo không có đối số.
public class ClassToSerialize {
public enum MyEnum {
FIRST,SECOND,THIRD
}
public String stringValue = "ABCD";
public MyEnum myEnum;
@JsonCreator
public ClassToSerialize(MyEnum myEnum) {
this.myEnum = myEnum;
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
ClassToSerialize classToSerialize = new ClassToSerialize(MyEnum.FIRST);
String jsonString = mapper.writeValueAsString(classToSerialize);
System.out.println(jsonString);
ClassToSerialize deserialized = mapper.readValue(jsonString, ClassToSerialize.class);
System.out.println("StringValue: " + deserialized.stringValue);
System.out.println("MyEnum: " + deserialized.myEnum);
}
}
Trong ví dụ này, hàm tạo duy nhất được đánh dấu là @JsonCreator
, do đó Jackson sẽ sử dụng hàm tạo này để tạo cá thể. Nhưng đầu ra giống như:
Nối tiếp: {"stringValue": "ABCD", "myEnum": "FIRST"}
Ngoại lệ trong luồng "chính" com.fasterxml.jackson.databind.exc.InvalidFormatException: Không thể xây dựng thể hiện của ClassToSerialize $ MyEnum
từ giá trị chuỗi 'stringValue': giá trị không phải là một trong các tên đối tượng Enum được khai báo: [FIRST, SEC]
Nhưng sau khi thêm @JsonProperty
chú thích vào hàm tạo:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
Quá trình khử lưu huỳnh thành công:
Nối tiếp: {"myEnum": "FIRST", "stringValue": "ABCD"}
StringValue: ABCD
MyEnum: ĐẦU TIÊN