如何使用Java Spring从XML创建对象列表?

问题描述

我想从API获取数据,它给了我this这样的XML数据

我可以将其中的最后一个映射到对象。参见下面的代码

public void getCurrencies() {

        XmlMapper xmlMapper = new XmlMapper();
        Currency currency = null;
        try {
            currency = xmlMapper.readValue(
                    new URL("https://www.lb.lt/webservices/FxRates/FxRates.asmx/getCurrentFxRates?tp=eu"),Currency.class);
            CurrencyBase c = currency.getCurrencyBase();
            CurrencyAmount d = c.getCurrencyAmount();
            System.out.println(d.getName());
        } catch (Exception e) {
            System.out.println(e);
        }

    }

但是如何将XML数据解析为对象列表?

我的货币模型:

@JacksonXmlRootElement(localName = "FxRates")
public class Currency {
    @JacksonXmlProperty(localName = "FxRate")
    @JacksonXmlElementWrapper(useWrapping = true)
    private CurrencyBase currencyBase;


public class CurrencyBase {
    @JacksonXmlProperty(localName = "Tp")
    private String type;
    @JacksonXmlProperty(localName = "Dt")
    private String date;
    @JacksonXmlProperty(localName = "CcyAmt")
    @JacksonXmlElementWrapper(useWrapping = true)
    private CurrencyAmount currencyAmount;

public class CurrencyAmount {
    @JacksonXmlProperty(localName = "Ccy")
    private String Name;
    @JacksonXmlProperty(localName = "Amt")
    private String ConvertionRate;
  

解决方法

您需要使用TypeReference来映射对象列表。您具有CurrencyBase列表,而不是Currency本身。这是使其工作的代码更改:

    public void getCurrencies() {
    XmlMapper xmlMapper = new XmlMapper();
    List<CurrencyBase> currency = null;
    try {
        currency = xmlMapper.readValue(
                new URL("https://www.lb.lt/webservices/FxRates/FxRates.asmx/getCurrentFxRates?tp=eu"),new TypeReference<List<CurrencyBase>>(){});
        System.out.println(currency);
    } catch (Exception e) {
        System.out.println(e);
    }
}

还必须更改@JacksonXmlElementWrapper(useWrapping = false)并将CurrencyAmount更改为List:

public class CurrencyBase {

    @JacksonXmlProperty(localName = "Tp")
    private String type;
    @JacksonXmlProperty(localName = "Dt")
    private String date;
    @JacksonXmlProperty(localName = "CcyAmt")
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<CurrencyAmount> currencyAmount;
}