2015-03-09 14 views
5

otrzymuję błąd:Nie można mapie JSON do fasoli Java

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.zee.FilterVO out of START_ARRAY token. at [Source: [email protected]362; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: : Can not deserialize instance of com.zee.FilterVO out of START_ARRAY token

połączenia Java, aby uzyskać JSON:

ResponseEntity<FilterVO> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, FilterVO.class); 

Java Bean na mapie JSON:

public class FilterVO { 

    private String userName; 
    private String expirationTime; 
    private String lastMatchedTime; 
    private String state; 
    private Integer matchedTodayCount; 
    private Boolean useRegEx; 
    private List<String> matchStrings; 
    private List<String> hosts; 
    private String activationTime; 
    private String objectId; 
    private String description; 
    public Map<String, String> nameValuePairs; 

    getters and setters.... 
} 

JSON co jestem przypuszczać, aby dostać:

[{ 
    "userName": "Z111111", 
    "expirationTime": "2015-03-15T14:00:00.000-0400", 
    "activationTime": "1969-12-31T19:00:00.000-0500", 
    "hosts": ["aa", "bb"], 
    "matchStrings": [" aa is not running", " bb is not running"], 
    "useRegEx": false, 
    "nameValuePairs": { 
     "KEY VALUE": "asasa", 
     "PROGRAM": "dsds", 
     "REGION": "dfsffs" 
    }, 
    "objectId": "SOMEID:20141015140803579-802", 
    "matchedTodayCount": 190, 
    "lastMatchedTime": "2015-03-09T07:53:20.366-0400", 
    "state": "ACTIVE", 
    "description": "Blah Blah Blah..." 
}] 

Initially I thought I am facing this issue because of deserialization of one element Array. So I modified my java code.

private void getFilter() { 
     RestTemplate restTemplate = getCustomRestTemplate(); 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); 
     headers.set("access-token", getAccessToken()); 
     HttpEntity<String> entity = new HttpEntity<String>("parameters", headers); 
     ResponseEntity<FilterVO> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, entity, FilterVO.class); 
} 

private RestTemplate getCustomRestTemplate() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);  
     MappingJacksonHttpMessageConverter messageConverter = new MappingJacksonHttpMessageConverter(); 
     messageConverter.setObjectMapper(mapper); 
     List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>(); 
     messageConverters.add(messageConverter); 
     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.setMessageConverters(messageConverters); 
     return restTemplate; 
} 

Wciąż otrzymuję ten sam błąd.

Mam następujące jackson słoików w mojej ścieżce klas:

jackson-annotations-2.5.1.jar 
jackson-core-2.5.1.jar 
jackson-core-asl-1.9.13.jar 
jackson-databind-2.5.1.jar 
jackson-datatype-joda-2.5.1.jar 
jackson-mapper-asl-1.9.13.jar 

Pełna ślad stosu:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.zee.FilterVO out of START_ARRAY token 
at [Source: [email protected]96; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.zee.FilterVO out of START_ARRAY token 
at [Source: [email protected]96; line: 1, column: 1] 
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readJavaType(MappingJacksonHttpMessageConverter.java:179) 
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.read(MappingJacksonHttpMessageConverter.java:171) 
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:94) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:693) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:679) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:496) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:465) 
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:416) 
    at com.fidelity.selfservice.test.JMagicRestAPI.getFilter(JMagicRestAPI.java:63) 
    at com.fidelity.selfservice.test.JMagicRestAPI.main(JMagicRestAPI.java:46) 
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.zee.FilterVO out of START_ARRAY token 
at [Source: [email protected]96; line: 1, column: 1] 
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) 
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromArray(BeanDeserializer.java:875) 
    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:597) 
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732) 
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1923) 
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readJavaType(MappingJacksonHttpMessageConverter.java:176) 
    ... 9 more 
+0

Co powiesz na mapę, jeśli ją usuniesz, działa? – sgpalit

+0

Usunięto "Mapę", wciąż ten sam błąd – Zeeshan

+0

Czy twoja metoda 'restTemplate.exchange' odczytuje kompletną odpowiedź poprawnie? Czy serwer przepłukuje całą odpowiedź pod koniec cyklu przetwarzania odpowiedzi? – RaviH

Odpowiedz

4

Problem polega na tym, że dostajesz tablicę JSON, ale jesteś próbuje deserializować ten JSON z POJO, FilterVO w twoim przypadku.

Spróbuj zmienić tę linię:

ResponseEntity<FilterVO> responseEntity = 
    restTemplate.exchange(url, HttpMethod.GET, entity, FilterVO.class); 

przez ten jeden:

ResponseEntity<List<FilterVO>> responseEntity = 
    restTemplate.exchange(url, HttpMethod.GET, entity, 
    new ParameterizedTypeReference<List<FilterVO>>() {}); 

Teraz masz List<FilterVO> pracować.

+2

Opublikowany JSON, który rozwiązuje, nie jest tablicą, ale być może spowodował błąd wklejania kopii; zobaczymy :) –

+2

@MarvinEmilBrach z pewnością, ale stacktrace wskazuje, że tablica jest wysyłana z powrotem. –

+2

@MarvinEmilBrach Otrzymuję tablicę JSON. Brakowało nawiasów kwadratowych. :( – Zeeshan

Powiązane problemy