Skip to content

@JsonUnwrapped does not work inside list #676

Open
@SimonCockx

Description

@SimonCockx

@JsonUnwrapped does not unwrap items inside a list. Below is a minimal example of what I'm trying to achieve.

I'm trying to model the following simple XSD scheme in Java.

<xs:element name="document" type="Document" />
<xs:complexType name="Document">
  <xs:sequence maxOccurs="unbounded">
    <xs:element name="a" type="xs:string" />
    <xs:element name="b" type="xs:string" />
  </xs:sequence>
</xs:complexType>

There is one type Document which contains a sequence of alternating a and b elements. E.g., this is a valid XML instance:

<document>
  <a>A1</a>
  <b>B1</b>
  <a>A2</a>
  <b>B2</b>
  <a>A3</a>
  <b>B3</b>
</document>

I tried to represent this in Java using the following classes:

@JacksonXmlRootElement(localName = "document")
public class Document {
    private List<ABPair> abPairs = new ArrayList<>();

    @JsonUnwrapped
    @JacksonXmlElementWrapper(useWrapping = false)
    public List<ABPair> getABPairs() {
        return abPairs;
    }
    public Document addABPair(ABPair pair) {
        abPairs.add(pair);
        return this;
    }
}

public static class ABPair {
    private String a;
    private String b;
    
    public String getA() {
        return a;
    }
    public String getB() {
        return b;
    }

    public ABPair setA(String a) {
        this.a = a;
        return this;
    }
    public ABPair setB(String b) {
        this.b = b;
        return this;
    }
}

However, the @JsonUnwrapped does not seem to work in conjunction with useWrapping = false.
Unit test reproducing the problem:

@Test
public void test() throws JsonProcessingException {
    XmlMapper mapper = new XmlMapper();

    Document document =
            new Document()
                    .addABPair(new ABPair().setA("A1").setB("B1"))
                    .addABPair(new ABPair().setA("A2").setB("B2"))
                    .addABPair(new ABPair().setA("A3").setB("B3"));
    assertEquals("<document><a>A1</a><b>B1</b><a>A2</a><b>B2</b><a>A3</a><b>B3</b></document>", mapper.writeValueAsString(document));
}

The actual result is "<document><abpairs><a>A1</a><b>B1</b></abpairs><abpairs><a>A2</a><b>B2</b></abpairs><abpairs><a>A3</a><b>B3</b></abpairs></document>".

Is there a way to get this working in Jackson?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions