问题描述
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;
}