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

时间:2013-02-12 13:09:01

标签: android

我使用spring android框架通过Http GET检索json数据。我得到了同样的异常:

- 无法读取JSON:无法从START_OBJECT标记中反序列化com.springandroidjsondemo.beans.LoginBean []的实例

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"}]}

我不确定杰克逊编组是否需要任何注释

请建议解决方案

谢谢!

1 个答案:

答案 0 :(得分:0)

这是杰克逊反序列化问题。如果将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);