我使用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"}]}
我不确定杰克逊编组是否需要任何注释
请建议解决方案
谢谢!
答案 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);