我想将我收到的JSON-String序列化为POJO,以便在我的代码中进一步使用,但是我很难在不编写自定义序列化程序的情况下使其工作。我更喜欢在不编写自定义序列化程序的情况下作为解决方案,但如果这是唯一可行的方法,我将编写一个。另外我相信我收到的数据是一个奇怪的JSON,因为我请求的列表不是作为列表使用[]而是作为使用的对象发送的{}。我收到以下列表/对象(缩写):{ "results": { "ALL": { "currencyName": "Albanian Lek", "currencySymbol": "Lek", "id": "ALL" }, "XCD": { "currencyName": "East Caribbean Dollar", "currencySymbol": "$", "id": "XCD" }, "EUR": { "currencyName": "Euro", "currencySymbol": "â?¬", "id": "EUR" }, "BBD": { "currencyName": "Barbadian Dollar", "currencySymbol": "$", "id": "BBD" }, "BTN": { "currencyName": "Bhutanese Ngultrum", "id": "BTN" }, "BND": { "currencyName": "Brunei Dollar", "currencySymbol": "$", "id": "BND" } }}哪个好。现在我写了另一个POJO作为数据的包装器,上面的层看起来像这样:public class CurrencyListDTO implements Serializable { private List<Map<String, CurrencyDTO>> results; public CurrencyListDTO() { }}添加注释@JsonAnySetter或使用@JsonCreator也没有帮助,所以我再次删除它们,现在我想知道哪个小技巧可以启用正确的json序列化。我的例外情况如下:com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token at [Source: (String)"{"results":{"ALL":{"currencyName":"Albanian Lek","currencySymbol":"Lek","id":"ALL"},"XCD":{"currencyName":"East Caribbean Dollar","currencySymbol":"$","id":"XCD"},"EUR":{"currencyName":"Euro","currencySymbol":"â?¬","id":"EUR"},"BBD":{"currencyName":"Barbadian Dollar","currencySymbol":"$","id":"BBD"},"BTN":{"currencyName":"Bhutanese Ngultrum","id":"BTN"},"BND":{"currencyName":"Brunei Dollar","currencySymbol":"$","id":"BND"},"XAF":{"currencyName":"Central African CFA Franc","id":"XAF"},"CUP":{"cur"[truncated 10515 chars]; line: 1, column: 12] (through reference chain: com.nico.Banking.api.data.dto.CurrencyListDTO["results"])
2 回答

BIG阳
TA贡献1859条经验 获得超6个赞
你CurrencyListDTO
应该看起来像下面。results
属性是JSON Object
应该直接映射到的属性Map
。您可以将其转换为Collection
使用keySet
或values
方法。
class CurrencyListDTO implements Serializable { private Map<String, CurrencyDTO> results; public Map<String, CurrencyDTO> getResults() { return results; } public void setResults(Map<String, CurrencyDTO> results) { this.results = results; } @Override public String toString() { return "CurrencyListDTO{" + "results=" + results + '}'; }}

湖上湖
TA贡献2003条经验 获得超2个赞
你应该CurrencyListDTO改为:
public class CurrencyListDTO {
private Map<String, CurrencyDTO> results;
// getters and setters
}
因为results响应对象中的字段是另一个具有currencyIdas键且没有数组的对象。
然后,您可以创建这样的货币列表:
ObjectMapper mapper = new ObjectMapper();
CurrencyListDTO result = mapper.readValue(json, CurrencyListDTO.class);
List<CurrencyDTO> currencies = new ArrayList<>(result.getResults().values());
添加回答
举报
0/150
提交
取消