我正在编写一个应用程序,以使用外部API转换器https://exchangeratesapi.io/的货币值将一种货币转换为另一种货币。

例如,https://api.exchangeratesapi.io/latest?base=USD&symbols=GBP返回以下内容

{
"rates": {
        "GBP": 0.7614025599
    },
    "base": "USD",
    "date": "2019-12-05"
}


https://api.exchangeratesapi.io/latest?base=CZK&symbols=IDR返回以下内容

{
    "rates": {
        "IDR": 611.2869231372
    },
    "base": "CZK",
    "date": "2019-12-05"
}

If you notice the above two outputs, currency value pair supplied as an object and the key is



我想为上述输出创建两个DTO类,以用于JSON解析器。

Converter.java

class Converter {
    private String date;
    private RatesObject rates;
    private String base;
}


RatesObject.java

public class RatesObject {
    private String Currency;
}


现在实际的问题是货币密钥不是通用密钥,每次我使用不同货币消费数据时,都会返回具有如上所述的原始货币值(例如“ EUR”或“ USD”)的密钥利率对象。我知道如何处理货币是否以数组形式发送,如下所示,但将其作为对象返回。

{
    "rates": [{
        "IDR": 611.2869231372
    }],
    "base": "CZK",
    "date": "2019-12-05"
}


有什么建议来处理这样的输出?

最佳答案

这里有2个解决方案,可通过Jackson进行处理,请参见下文。并且由于您已经知道该符号(在请求参数中),因此可以按名称检索值。

解决方案1
rates声明为JsonNode

class Converter {
    private String date;
    private JsonNode rates;
    private String base;

    //general getters and setters
}


ObjectMapper mapper = new ObjectMapper();
Converter converterGbp = mapper.readValue(jsonGbp, Converter.class);
System.out.println(converterGbp.getRates().get("GBP").asText()); //0.7614025599


解决方案2
rates声明为Map<String, Object>

class Converter {
    private String date;
    private Map<String, Object> rates;
    private String base;

    //general getters and setters
}

ObjectMapper mapper = new ObjectMapper();
Converter converterGbp = mapper.readValue(jsonGbp, Converter.class);
System.out.println(converterGbp.getRates().get("GBP").toString()); //0.7614025599

10-08 16:38