Pertanyaan Tidak dapat deserialize daftar langsung di dalam rootelement menggunakan Jackson XML


Saya tidak dapat deserialize daftar yang merupakan direktori anak dari elemen root, saya telah mencoba berbagai macam hal.

Kode saya:

private static class Cards {
    @JacksonXmlElementWrapper(localName = "Cards")
    private List<Card> cards;

    public List<Card> getCards() {
        return new ArrayList<>(cards);
    }
}

private static class Card {
    @JsonProperty("Name")
    private String name;

    @JsonProperty("Image")
    private String image;

    @JsonProperty("CardType")
    private String cardType;

    private final Map<String, Integer> resources = new HashMap<>();

    private boolean duplicateResources = false;
    private final List<String> duplicateResourceNames = new ArrayList<>();

    @JsonAnySetter
    private void addResource(final String name, final Object value) {
        if (resources.containsKey(name)) {
            duplicateResources = true;
            duplicateResourceNames.add(name);
        }
        resources.put(name, Integer.parseInt(value.toString()));
    }

    public String getName() {
        return name;
    }

    public String getImage() {
        return image;
    }

    public String getCardType() {
        return cardType;
    }

    @JsonAnyGetter
    public Map<String, Integer> getResources() {
        if (duplicateResources) {
            throw new UncheckedCardLoadingException("Resources " + duplicateResourceNames + " have duplicate entries");
        }
        return new HashMap<>(resources);
    }
}

Dan:

ObjectMapper xmlMapper = new XmlMapper();
Cards cards = xmlMapper.readValue(path.toFile(), Cards.class);

Saat mencoba mendesentralisasi XML berikut:

<Cards>
    <Card>
        <Name>test</Name>
        <Image></Image>
        <CardType>test</CardType>
    </Card>
</Cards>

Ini memberi sebagai kesalahan:

com.cardshifter.core.cardloader.CardLoadingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Card" (class com.cardshifter.core.cardloader.XmlCardLoader $ Cards), tidak ditandai sebagai ignorable (satu properti yang dikenal) : "Kartu-kartu"])    di [Sumber: C: \ Pengguna \ Frank \ Dropbox \ NetbeansProjects \ Cardshifter \ cardshifter-core \ target \ test-classes \ com \ cardshifter \ core \ cardloader \ single-card.xml; baris: 3, kolom: 9] (melalui rantai referensi: com.cardshifter.core.cardloader.Cards ["Kartu"])


4
2017-10-28 18:14


asal


Jawaban:


Pertama-tama, lihat ini:

@JacksonXmlElementWrapper(localName = "Cards")
private List<Card> cards;

Dan kemudian lihat kesalahannya:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Card" (class com.cardshifter.core.cardloader.XmlCardLoader$Cards)

Tidak ada yang mengatakannya "Kartu" di kelasmu.

Kedua, setelah memperbaikinya, inilah cara saya menyelesaikan seluruh pemuatan Anda:

private static class Cards {
    @JacksonXmlElementWrapper(localName = "Card")
    @JsonProperty("Card")
    private List<Card> card = new ArrayList<>();

    @JsonSetter
    public void setCard(Card card) {
        this.card.add(card);
    }
}

Itu setCard Metode hanya mengatakan Jackson bahwa jika bertemu ini, ia harus menafsirkannya sebagai Card, dan kemudian Anda memberikan metode yang menambahkannya ke array.


9
2017-10-28 18:39