使用JSON和Spring RestTemplate反序列化数字字段

时间:2018-04-05 12:26:30

标签: java json spring deserialization resttemplate

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

WS电话代码:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:forEach items="${message}" var="entry">
    <span class="errorMessage">${entry.value}</span>
</c:forEach>

WS响应代码段

errorMessage

}

自定义对象定义:

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

我在{ "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;
    }
}

解析String字段可以很好地工作。我错过了什么?解析数字字段需要做什么?我尝试过使用int,long,double,BigDecimal,得到相同的异常错误。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我不确定但是在没有“数据”节点的情况下尝试WS响应

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

或者尝试mappe到具有属性List<GetPassengersData> data

的对象