Error Deserializing Enum with @JsonCreator Using Jackson XmlMapper

27 views
Skip to first unread message

Francesco Xia

unread,
Nov 5, 2024, 8:56:39 PM11/5/24
to jackson-user
Hello,
I’m trying to serialize an Enum value to XML, then read it back, but I get an input mismatch error related to JsonCreator.
It seems the factory method was defined correctly, e.g., factory method annotated with JsonCreator and argument without JsonProperty.

Could someone provide insights into why deserialization fails?
Any help would is appreciated. Thank you.

Error
```java
com.fasterxml.jackson.databind.exc.MismatchedInputException: Input mismatch reading Enum `com.xxx.yyy.Country`: properties-based `@JsonCreator` ([method com.xxx.yyy.Country#fromValue(java.lang.String)]) expects String Value, got Object value (`JsonToken.START_OBJECT`)
```

Test
```java
@Test
void aTest() throws JsonProcessingException {
XmlMapper xmlMapper = new XmlMapper();

String s = xmlMapper.writeValueAsString(Country.ITALY);
assertThat(s).isEqualTo("<Country>Italy</Country>");

Country country = xmlMapper.readValue(s, Country.class);
assertThat(country).isEqualTo(Country.ITALY);
}
```

Country.java
```java
public enum Country {
ITALY("Italy"),
NETHERLANDS("Netherlands");

private String value;

Country(String value) {
this.value = value;
}

@JsonValue
public String getValue() {
return value;
}

@Override
public String toString() {
return java.lang.String.valueOf(value);
}

@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static Country fromValue(String value) {
for (Country b : Country.values()) {
if (b.value.equals(value)) {
return b;
}
}
throw new IllegalArgumentException("Unexpected value '" + value + "'");
}
}
```
Reply all
Reply to author
Forward
0 new messages