for completeness this is the bug report opened on jackson-dataformat-xml
https://github.com/FasterXML/jackson-dataformat-xml/issues/682
Thank you for you assistance @tatu
On Thursday, November 7, 2024 at 3:44:48 AM UTC+1 Tatu Saloranta wrote:
> 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/526444aa-9f2d-4b98-b1ad-35c12ae64232n%40googlegroups.com.