I would file a bug report (issue on jackson-dataformat-xml).
The problem itself is that due to differences between logical content
model of XML and JSON, XmlMapper has to provide work-arounds to cases
like this -- since module exposes this:
<Country>Italy</Country>
as basically equivalent to same token sequence as:
{ "Country": "Italy" }
there's a need to "unwrap" String value. This should happen for plain
`String` type (you can try it), and probably even default Enums. But I
think this won't be done for custom constructors.
So that's missing handling.
A possible work-around would be to take in `JsonNode` (instead of
`String`) and handle `ObjectNode` case (for XML), and if necessary,
regular `TextNode` for other formats like JSON.
-+ Tatu +-
On Tue, Nov 5, 2024 at 5:56 PM 'Francesco Xia' via jackson-user
<[email protected]> wrote:
>
> 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 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 +
> "'");
> }
> }
> ```
>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion visit
> https://groups.google.com/d/msgid/jackson-user/439271ea-1295-42fd-ac25-e1f363d1f5a0n%40googlegroups.com.
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/jackson-user/CAL4a10g6KbwUmeLjiKQxtHpFiXdoHjLxZbLrz8e5uRAdM3eq5g%40mail.gmail.com.