XML Object Mapper List

OnDemand

Top Contributor
Moin,

hab unten stehenden Teil XML, bekomme es nur nicht in mein Pojo. Kann mit jemand sagen was ich falsch mach? Alle anderen Werte kann ich auslesen.

Nur bei der List bekomme ich folgenden Fehler:
Cannot construct instance of java.util.ArrayList (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('http://srv0.xxx933771.jpg')

Java:
<images>
    <image_url>http://srv0.xxx933771.jpg</image_url>
    <image_url>http://srv0.xxx933771.jpg</image_url>
    <image_url>http://srv0.xxx933771.jpg</image_url>
</images>

Mein Code dazu:

Code:
public class Class {

    @JacksonXmlProperty(isAttribute = true, localName = "id")
    private String sku;

    @JacksonXmlProperty(localName = "name")
    private String name;

    @JacksonXmlProperty(localName = "images")
    private Images images;
}

Code:
public class Images {
    @JacksonXmlProperty(localName = "image_url")
    private List<String> imageUrl = new ArrayList<String>();
}

Daaaanke für euren Input
 

KonradN

Super-Moderator
Mitarbeiter
Also ich gehe erst einmal davon aus, dass as XML eine Instanz von Class sein soll. Und da ist das nicht die XML Struktur, die Du da hättest. Das wäre etwas mit <images><image_url><value>...</value><value>...</value></image_url><images>

Und mein Tipp bei sowas ist auch: Erstelle eine Instanz und serialisierre sie zu XML Dann siehst Du, das da heraus kommen würde.

Das XML entspricht eher etwas wie:

Java:
public class Class {

    @JacksonXmlProperty(isAttribute = true, localName = "id")
    private String sku;

    @JacksonXmlProperty(localName = "name")
    private String name;

    @JacksonXmlProperty(localName = "images")
    @JacksonXmlElementWrapper(localName = "image_url")
    private List<String> images;
}

Natürlich ungetestet und so im Forum entstanden.
 

OnDemand

Top Contributor
Daanke! Das hab ich erst auch schon versucht. Wohlmöglich habe ich images und image_url vertauscht. Das probier ich dann nochmal danke!

Java:
@JacksonXmlProperty(localName = "images")
@JacksonXmlElementWrapper(localName = "image_url")
private List<String> images;
 

OnDemand

Top Contributor
die Liste bleibt null, das ist ja kurios
Java:
 @JacksonXmlProperty(localName = "images")
 @JacksonXmlElementWrapper(localName = "image_url")
 private List<String> images;

1676743754027.png
da werd ich mal andersherum so lange rum doctern bis beim serialisieren raus kommt, was ich brauch.
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe mich natürlich geirrt: Der Wrapper Wert ist ja der Wert, der etwas umschliesst. Das muss also images sein.

Kleiner Test (Ja, ehe ich etwas falsches schreibe, einfach mal schnell selbst schnell ein Test geschrieben):

Java:
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class SerializationTest {

    public static class Entity {
        @JacksonXmlProperty(localName = "name")
        public String name;

        @JacksonXmlProperty(localName = "image_url")
        @JacksonXmlElementWrapper(localName = "images")
        public List<String> images = new ArrayList<>();
    }

    @Test
    public void testSerialization() throws Exception {
        Entity entity = new Entity();
        entity.name = "Hugo";
        entity.images.add("Hallo");
        entity.images.add("Du");

        XmlMapper xmlMapper = new XmlMapper();

        System.out.println(xmlMapper.writeValueAsString(entity));

        String xml = "<element><name>Test</name><images>\n" +
                "    <image_url>http://srv0.xxx933771.jpg</image_url>\n" +
                "    <image_url>http://srv1.xxx933771.jpg</image_url>\n" +
                "    <image_url>http://srv2.xxx933771.jpg</image_url>\n" +
                "</images></element>";


        Entity value
                = xmlMapper.readValue(xml, Entity.class);
        assertEquals("Test", value.name);
        assertEquals("http://srv0.xxx933771.jpg", value.images.get(0));
        assertEquals("http://srv1.xxx933771.jpg", value.images.get(1));
        assertEquals("http://srv2.xxx933771.jpg", value.images.get(2));
    }

}

Das Encoding teste ich nicht mit asserts da dies nur zum nachsehen war, was man da bekommt - die ist bei dem Test aber:
Code:
<Entity><name>Hugo</name><images><image_url>Hallo</image_url><image_url>Du</image_url></images></Entity>

In dem Test initialisiere ich images immer mit einer ArrayList - das ist aber nicht notwendig.

Edit: Error behoben - natürlich muss wrapper images sein - das umschließt ja alles.
 

OnDemand

Top Contributor
@KonradN kannst du mir bitte nochmal helfen?

Habe folgenden Test geschrieben, komme aber nicht an den Price-Double Wert, da es bei mir immer <value></value> um den Double wert tagged.

Java:
class ImportTest {

    @Data
    public static class Product {
        @JacksonXmlProperty(localName = "price")
        @JacksonXmlElementWrapper(localName = "prices")
        public List<Price> priceList = new ArrayList<>();
    }

    @Data
    @JacksonXmlRootElement
    public static class Price {
        @JacksonXmlProperty(localName = "currency", isAttribute = true)
        public String currency;

        public Double value;
    }
    
    @Test
    public void testSerialization() throws Exception {

        List<Price> priceList = new ArrayList<>();
        Price price = new Price();
        price.setCurrency("EUR");
        price.setValue(39.0);
        priceList.add(price);

        Product product = new Product();
        product.setPriceList(priceList);
        
        XmlMapper xmlMapper = new XmlMapper();

        System.out.println(xmlMapper.writeValueAsString(product));

        String xml = "<Product><prices><prices currency=\"EUR\">39.0</prices></prices></Product>";

        Product value = xmlMapper.readValue(xml, Product.class);
        assertEquals(value,xml);
    }
}

und das XML

Code:
<Product>
  <prices>
    <price currency="EUR">16.9</price>
    <price currency="CHF">19.9</price>
  </prices>
</Product>

Mein output lautet

Code:
<Product>
  <prices>
    <price currency="EUR"><value>39.0</value></price>
  </prices>
</Product>
 

Ähnliche Java Themen

Neue Themen


Oben