使用Spring Android Framework通过HTTP GET检索JSON数据



我使用spring-android框架通过Http GET检索json数据。我得到以下相同的例外:

-无法读取JSON:无法反序列化com.springandroidjsondemo.beans.LoginBean[]的实例超出START_OBECT令牌

bean(LoginBean)正在跟踪

    package com.springandroidjsondemo.beans;
public class LoginBean {

    private String status;
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
}

android代码如下:

  HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Collections.singletonList(new MediaType("application", "json")));
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate();
// Add the Jackson message converters
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
// Make the HTTP GET request, marshaling the response from JSON to an array of Events
ResponseEntity<LoginBean[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, requestEntity,LoginBean[].class); // getting exception here
LoginBean[] loginBean = responseEntity.getBody();
String status = loginBean[0].getStatus();

来自服务器的json响应如下:

{"emp-data":[{"status":"true"}]}

我不确定Jackson Marshalling 是否需要任何注释

请建议解决方案

谢谢!

这是一个Jackson反序列化问题。如果将JSON响应与LoginBean进行比较,则状态数组包含在元素"emp-data"中。但是,您的RestTemplate请求需要JSON,如下所示。

[{"status":"true"},{"status":"false"}]

你有几个选择。您可以围绕LoginBean创建一个包装器对象。或者,您可以尝试如下注释LoginBean:

@JsonRootName(value = "emp-data")
public class LoginBean {
    ...
}

为了实现这一点,您可能需要配置Jackson ObjactMapper。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
MappingJackson2HttpMessageConverter jackson = new MappingJackson2HttpMessageConverter();
jackson.setObjectMapper(objectMapper);
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(jackson);    

最新更新