【问题标题】:Deserializing numerical fields with JSON and Spring RestTemplate使用 JSON 和 Spring RestTemplate 反序列化数字字段
【发布时间】:2018-04-05 12:26:30
【问题描述】:

我正在使用 Spring 和 Resttemplate 调用 WS,并尝试将 JSON 响应解析为自定义对象。

WS调用sn-p:

RestTemplate restTemplate = new RestTemplate();

String wsURL = "https://www.dummyws.com";
String accessToken = "dummyAccessToken"

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("Authorization", "Bearer " + accessToken);
headers.add("Accept", "*/*");

MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();                       
HttpEntity<MultiValueMap<String, String>> wsRequest = new HttpEntity<MultiValueMap<String, String>>(map, headers);

ResponseEntity<GetPassengersData> wsResponse = restTemplate.exchange(wsURL, HttpMethod.GET, wsRequest, GetPassengersData.class);
GetPassengersData getPassengerData = wsResponse.getBody();

WS 响应 sn-p:

{
"data" : [{
        "start" : "2018-01-01 00:00:00",
        "finish" : "2018-01-01 23:59:59",
        "total" : 1076
    }
]

}

自定义对象定义:

@JsonIgnoreProperties(ignoreUnknown = true)
public static class GetPassengersData implements Serializable
{
    private static final long serialVersionUID = 1L;

    public GetPassengersData() 
    {   
    }       

    private List<GetPassengersDataItem> data;
    public List<GetPassengersDataItem> getData() {
        return data;
    }
    public void setData(List<GetPassengersDataItem> data) {
        this.data = data;
    }
}

@JsonIgnoreProperties(ignoreUnknown = true) 
public static class GetPassengersDataItem implements Serializable
{
    private static final long serialVersionUID = 1L;

    public GetPassengersDataItem() 
    {   
    }       

    private String start;
    private String finish;
    private double total;

    public String getStart() {
        return start;
    }
    public void setStart(String start) {
        this.start = start;
    }
    public String getFinish() {
        return finish;
    }
    public void setFinish(String finish) {
        this.finish = finish;
    }
    public double getTotal() {
        return total;
    }
    public void setTotal(double total) {
        this.total = total;
    }
}

restTemplate.exchange 中出现以下异常:

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of double out of START_OBJECT token
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@552b744a; line: 5, column: 44] (through reference chain: *.GetPassengersData["data"]->*.GetPassengersDataItem["total"]); nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of double out of START_OBJECT token

仅解析字符串字段效果很好。我错过了什么?我需要做什么来解析数字字段?我试过 int、long、double、BigDecimal,得到同样的异常错误。

提前致谢。

【问题讨论】:

    标签: java json spring deserialization resttemplate


    【解决方案1】:

    我不确定,但请尝试不带“数据”节点的 WS 响应

    { 
      [{
        "start" : "2018-01-01 00:00:00",
        "finish" : "2018-01-01 23:59:59",
        "total" : 1076
      }]
    }
    

    或者尝试映射到具有List&lt;GetPassengersData&gt; data属性的对象

    【讨论】:

    • 我认为这不是问题,因为如果我避免使用“total”字段,它会很好地工作。 “开始”和“结束”映射在 GetPassengersDataItem 和 GetPassengersData 对象中。问题只是 JSON 响应中的数字字段。
    • 尝试使用 2 项 GetPassengersDataItem 没有总计进行测试。也许避免在你的类命名中使用“Get”。
    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 2015-10-23
    • 1970-01-01
    • 2013-07-09
    • 2011-10-08
    • 1970-01-01
    • 2012-11-07
    相关资源
    最近更新 更多