他の回答に加えて、引数のないコンストラクタを持たないクラスでアノテーション@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インスタンス名の1つではありません:[FIRST、SECOND、THIRD]
しかし@JsonProperty
、コンストラクターにアノテーションを追加した後:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
逆シリアル化は成功しました:
シリアル化:{"myEnum": "FIRST"、 "stringValue": "ABCD"}
StringValue:ABCD
MyEnum:FIRST