นอกเหนือจากคำตอบอื่น ๆ แล้ว@JsonProperty
คำอธิบายประกอบนั้นสำคัญมากถ้าคุณใช้@JsonCreator
คำอธิบายประกอบในคลาสที่ไม่มีคอนสตรัคเตอร์ที่ไม่มีอาร์กิวเมนต์
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);
}
}
ในตัวอย่างนี้คอนสตรัคเดียวเท่านั้นที่ถูกทำเครื่องหมายว่า@JsonCreator
ดังนั้นแจ็คสันจะใช้ตัวสร้างนี้เพื่อสร้างอินสแตนซ์ แต่ผลลัพธ์เป็นเช่น:
ต่อเนื่อง: {"stringValue": "ABCD", "myEnum": "FIRST"}
ข้อยกเว้นในเธรด "main" com.fasterxml.jackson.databind.exc.InvalidFormatException: ไม่สามารถสร้างอินสแตนซ์ของ ClassToSerialize $ MyEnum
จากค่าสตริง 'stringValue': ค่าไม่ใช่หนึ่งในชื่อตัวอย่างของ Enum ที่ประกาศ: [FIRST, SECOND, THIRD]
แต่หลังจากเพิ่ม@JsonProperty
คำอธิบายประกอบใน Constructor แล้ว:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
deserialization สำเร็จ:
ต่อเนื่อง: {"myEnum": "FIRST", "stringValue": "ABCD"}
StringValue: ABCD
MyEnum: FIRST