Java >> Java tutorial >  >> Tag >> XML

Jackson XML-deserialisering springer felt over ved brug af multiple useWrapping =false

For enhver egenskab kan du angive en metode, der skal bruges som setter eller getter ved hjælp af Jackson-annoteringer (JsonSetter og JsonGetter). Når du bare har brug for en lille ændring af, hvad Jackson laver, så virker det nemmere end at skrive en brugerdefineret deserializer / serializer for hele klassen. Jackson har også en JsonAnySetter-annotation, der er en reserve til at bruge til noget, der ikke er angivet i din klasse (jeg har fundet ud af, at det nogle gange er praktisk; jeg har brugt det til at sætte alle XML-attributter for en type element i et enkelt kort i stedet for end at skulle have egenskaber for alle mulige attributter).

Du kan tilføje brugerdefinerede XML-deserialiseringsmetoder til din rodklasse. Noget som dette:

@JsonSetter(value =  "foo")
public void setFooFromXml(Foo foo) {
    if (this.foos == null) {
        this.foos = new ArrayList<Foo>();
    } 
    this.foos.add(foo);
}

@JsonSetter(value =  "bar")
public void setBarFromXml(Bar bar) {
    if (this.bars == null) {
        this.bars = new ArrayList<Bar>();
    } 
    this.bars.add(bar);
}

Bruger Jackson til at deserialisere XML på denne måde:

try {
    String input = "<root><foo name=\"AAA\" /><bar name=\"BBB\" /><foo name=\"CCC\" /></root>";
    XmlMapper mapper = new XmlMapper();
    Root root = mapper.readValue(input, Root.class);
    System.out.println(root.getBars());
    System.out.println(root.getFoos());
    
} catch (Exception e) {
    e.printStackTrace();
}

Giver et output af dette (efter tilføjelse af nogle simple toString() og getter metoder):

[Bar [name=BBB]]
[Foo [name=AAA], Foo [name=CCC]]

Jeg må erkende, at jeg normalt kun bruger Jackson til JSON-håndtering, men det ser ud til, at det er en kendt begrænsning af jackson-dataformat-xml bibliotek:

Før 2.12 (endnu ikke udgivet i maj 2020) var håndtering af gentagne XML-elementer problematisk (det kunne kun bevare det sidste element, der blev læst), men #403 forbedrer håndteringen

Måske kan dette problem være relateret til dit problem.

Som en løsning, hvis det er muligt, kan du anvende en form for XSLT-transformation til XML-dokumenterne, før du behandler dem, så alle noder med samme navn er grupperet sammen, og se om resultatet er som forventet.

Du kan også prøve andre deserialiseringsalternativer, primært JAXB eller direkte XML-behandling.


Java tag