为了账号安全,请及时绑定邮箱和手机立即绑定

如果没有自定义序列化器,这个字符串的Jackson序列化是否可行

如果没有自定义序列化器,这个字符串的Jackson序列化是否可行

12345678_0001 2019-04-25 18:15:17
我想将我收到的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使用keySetvalues方法。

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 +
                '}';
    }}


查看完整回答
反对 回复 2019-05-15
?
湖上湖

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());


查看完整回答
反对 回复 2019-05-15
  • 2 回答
  • 0 关注
  • 1108 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号