В fastxml, после десериализации json, если enum (с JsonFormat.Shape.OBJECT) является первым свойством в классе, другие поля имеют значение null.
Почему перечисление должно быть последним объявленным свойством в классе для десериализации других полейправильно?
Может быть, это может быть ошибка в fastxml?
Пример класса MyClass
:
public class MyClass {
// >>>
// >>> element field is null after deserialization
// >>>
private MyEnum option; // first
private String element; // --> null
// >>>
// >>> correctly deserialized if enum is last in order
// >>>
// private String element; // --> "elem"
// private MyEnum option; // last
public MyEnum getOption() {
return option;
}
public void setOption(MyEnum option) {
this.option = option;
}
public String getElement() {
return element;
}
public void setElement(String element) {
this.element = element;
}
}
Пример enum MyEnum
:
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum {
FIRST;
@JsonProperty
public String getOption() {
return name();
}
@JsonCreator
public static MyEnum forValue(String option) {
return FIRST;
}
}
Пример основного тестового класса Main
:
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MyClass myClass = new MyClass();
myClass.setElement("elem");
myClass.setOption(MyEnum.FIRST);
String serialized = mapper.writer().withDefaultPrettyPrinter().writeValueAsString(myClass);
System.out.println(String.format("serialized - %s", serialized));
MyClass deserialized = mapper.readValue(serialized, MyClass.class);
String deserializedResult = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(deserialized);
System.out.println(String.format("deserialized - %s", deserializedResult));
}
}
Поле вывода с выводом null
после десериализации:
serialized - {
"option" : {
"option" : "FIRST"
},
"element" : "elem"
}
deserialized - {
"option" : {
"option" : "FIRST"
},
"element" : null
}
Вывод после исправления порядка (строки без комментария в MyClass
):
serialized - {
"element" : "elem",
"option" : {
"option" : "FIRST"
}
}
deserialized - {
"element" : "elem",
"option" : {
"option" : "FIRST"
}
}