2015-01-20 207 views
1

我試着從春天RestTemplate的東西。我試圖讀取這個JSON數據:JSON Data。數據是一個鍵值對,其中鍵是「geonames」,值是「geoname」對象的數組。RestTemplate:無法將對象的實例反序列化爲START_OBJECT標記

我有一個Geoname類來處理輸入。這個班級裏還有getter和setter。然後,我有隻運行一個主要方法調用RestTemplate對象app類:

@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和使用映射到列表的常見問題。我甚至嘗試創建一個僅包含數組或Geoname對象的Geonames類,但這種方法也無法正常工作......始終存在相同的錯誤。也許,我沒有正確閱讀Json,但如果有人能借給我一雙眼睛,我會很感激。 :D

乾杯!

編輯

好吧,我現在有這個新的類,它現在做的JSON數據的GET請求。但是,在調試之後,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

已解決。事實證明,null是因爲JSON鏈接每小時的最大點擊數限制。通過在網站上創建我自己的帳戶,api給了我自己的限制。所以響應主體就會填充數據。

相關問題