2015-01-20 3 views
1

Я тестирую материал RestTemplate с весны. Я пытаюсь прочитать данные JSON: JSON Data. Данные представляют собой пару ключевых значений, в которой ключ является «geonames», а значение представляет собой массив объектов «geoname».RestTemplate: Невозможно десериализовать экземпляр объекта OBJECT из токена START_OBJECT

У меня есть класс Geoname для обработки ввода. В этом классе также есть геттеры и сеттеры. Я тогда класс приложений, который просто запускает основной метод для вызова RestTemplate объекта:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Geoname { 
    private String name; 
    private long lat; 
    private long lng; 
    private String countrycode; 
} 

App.java

public class App 
{ 
    public static void main(String[] args) 
    { 
     String jsonUrl = "http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo"; 

     RestTemplate template = new RestTemplate(); 
     ResponseEntity<Geoname[]> entity = template.getForEntity(jsonUrl, Geoname[].class); 
     List<Geoname> data = Arrays.asList(entity.getBody()); 

     System.out.print("Success!"); 
    } 
} 

Это моя ошибка выхода:

Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.declan.Geoname[] out of START_OBJECT token 
at [Source: [email protected]3ac5; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.declan.Geoname[] out of START_OBJECT token 
at [Source: [email protected]3ac5; line: 1, column: 1] 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:208) 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:200) 
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:96) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:812) 
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:796) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:576) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:529) 
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:261) 
    at com.declan.App.main(App.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.declan.Geoname[] out of START_OBJECT token 
at [Source: [email protected]3ac5; line: 1, column: 1] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:835) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:831) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.handleNonArray(ObjectArrayDeserializer.java:232) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:139) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:17) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3560) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2660) 
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:205) 
    ... 13 more 

Я я пробовал эту настройку, я пробовал использовать getForObject, как в весенней документации, я пробовал искать здесь в stackoverflow и использовать общий ответ отображения в список. Я даже попытался создать класс Geonames, содержащий только массив или объекты Geoname, но это тоже не сработало ... Такая же ошибка все время. Возможно, я не правильно читаю Json, но если кто-то может одолжить мне пару глаз, я был бы благодарен. : D

Cheers!

EDIT

Хорошо, теперь у меня есть этот новый класс, и теперь он делает запрос GET для данных в формате JSON. Однако после отладки тело ResponseEntity имеет массив, равный null. Нужно ли создавать экземпляр массива в Geonames вручную?

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Geonames { 
    @JsonProperty("geonames") 
    Geoname[] geonames; 

    public void setGeonames(Geonames[] geonames) { 
     this.geonames = geonames; 
    } 

    public void getGeonames() { 
     return geonames; 
    } 
} 

ответ

1

Решено. Оказывается, что нуль был вызван тем, что ссылка JSON имела максимальный балл за час. Создав собственную учетную запись на сайте, api дал мне свои ограничения. Таким образом, тело ответа заполняется данными.

Смежные вопросы