作为其他答案的补充,如果您在没有无参数构造函数的类中@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"}
线程“主”com.fasterxml.jackson.databind.exc.InvalidFormatException 中的异常:无法
从字符串值“stringValue”构造 ClassToSerialize$MyEnum 的实例:值不是声明的枚举实例名称之一:[FIRST,SECOND,THIRD]
但是在@JsonProperty
构造函数中添加注解之后:
@JsonCreator
public ClassToSerialize(@JsonProperty("myEnum") MyEnum myEnum) {
this.myEnum = myEnum;
}
反序列化成功:
序列化:{"myEnum":"FIRST","stringValue":"ABCD"}
字符串值:ABCD
我的枚举:第一