다른 답변 외에도 인수가없는 생성자가없는 클래스 @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
되므로 Jackson은이 생성자를 사용하여 인스턴스를 만듭니다. 그러나 결과는 다음과 같습니다.
일련 번호 : { "stringValue": "ABCD", "myEnum": "FIRST"}
스레드 "main"com.fasterxml.jackson.databind.exc.InvalidFormatException 예외 : 문자열 값 'stringValue'에서 ClassToSerialize $ MyEnum 인스턴스를 생성 할 수 없습니다
. 선언 된 Enum 인스턴스 이름 중 하나가 아닌 값 : [FIRST, SECOND, THIRD]
그러나 @JsonProperty
생성자에 주석을 추가 한 후 :
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
역 직렬화가 완료되었습니다.
일련 번호 : { "myEnum": "FIRST", "stringValue": "ABCD"}
StringValue : ABCD
MyEnum : 첫 번째