2014-07-21 23 views
29

Bana tüm ülkeleri veren dinlenme URL'im var - http://api.geonames.org/countryInfoJSON?username=volodiaL.JSON okuyamadı: START_OBJECT belirtecinden hello.Country [] 'den çıkış yapamazsınız.

ben java nesneleri içine döndü json ayrıştırmak için bahar 3'ten RestTemplate kullanın:

Nihayet
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of hello.Country[] out of START_OBJECT token 
at [Source: [email protected]149; line: 1, column: 1] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691) 
    at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:685) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.handleNonArray(ObjectArrayDeserializer.java:222) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:133) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:18) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158) 
    at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225) 
    ... 7 more 

benim Ülke sınıfı:

Bu kodu çalıştırdığınızda

RestTemplate restTemplate = new RestTemplate(); 
Country[] countries = restTemplate.getForObject("http://api.geonames.org/countryInfoJSON?username=volodiaL",Country[].class); 

istisna almak

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Country { 
    private String countryName; 
    private long geonameId; 

    public String getCountryName() { 
     return countryName; 
    } 

    public long getGeonameId() { 
     return geonameId; 
    } 

    @Override 
    public String toString() { 
     return countryName; 
    } 
} 

Sorun şu ki json, "geonames" içeren bir kök öğesi içerir. şöyle ülke elemanlarının rray:

{ 
"geonames": [ 
    { 
     "continent": "EU", 
     "capital": "Andorra la Vella", 
     "languages": "ca", 
     "geonameId": 3041565, 
     "south": 42.42849259876837, 
     "isoAlpha3": "AND", 
     "north": 42.65604389629997, 
     "fipsCode": "AN", 
     "population": "84000", 
     "east": 1.7865427778319827, 
     "isoNumeric": "020", 
     "areaInSqKm": "468.0", 
     "countryCode": "AD", 
     "west": 1.4071867141112762, 
     "countryName": "Andorra", 
     "continentName": "Europe", 
     "currencyCode": "EUR" 
    } 
] 
} 

Nasıl Country nesnesine dizinin her öğesi dönüştürmek için RestTemplate anlatmak için?

cevap

34

aşağıdakileri yapmak gerekir:

public class CountryInfoResponse { 

    @JsonProperty("geonames") 
    private List<Country> countries; 

    //getter - setter 
} 

RestTemplate restTemplate = new RestTemplate(); 
List<Country> countries = restTemplate.getForObject("http://api.geonames.org/countryInfoJSON?username=volodiaL",CountryInfoResponse.class).getCountries(); 

Eğer seviyeleri atlamak için izin açıklama çeşit kullanabilirsiniz, ancak bu henüz mümkün değilse (this ve this bakınız) harika olurdu

+0

Siz en iyisisiniz! Bunu duymak için –

+0

sevindim! – geoand

+0

bu benim için işe yaramadı, hala neden Caused by: com.fasterxml.jackson.databind.JsonMappingException: START_OBJECT belirteci – java1977

9

Başka bir çözüm: -List sorunumu çözdü jenerik Nesne

public class CountryInfoResponse { 
    private List<Object> geonames; 
} 

Kullanımı, bir Boolean gibi başka Datatyp'lar da vardı.

Listesi için İlkbahar-çizme 1.3.3 yöntem değişimi() için
+0

Bu benim için işe yarıyor ama bu bir tür çalışma, JSON nesnesini Country nesnesi –

0

ilgili cevap Benim durumumda

Spring Data Rest - _links

+0

içine eşlemeye çalışırken neden istisna attığını anlamadım. Lütfen anlam bilgilerini postaya yazınız. ** StackOverflow'ta sadece link ** bir cevap olarak önerilmemektedir. – Raju

2

gibi çalışıyor, ben JQuery ile <input type="text"> değerini başlamıştı ve ben yaptım Bu gibi:

var newUserInfo = { "lastName": inputLastName[0].value, "userName": inputUsername[0].value, 
"firstName": inputFirstName[0] , "email": inputEmail[0].value} 

Ve sürekli bu istisna

başlamıştı

com.fasterxml.jackson.databind.JsonMappingException: [Kaynak: [email protected] adresindeki START_OBJECT jetonu 'un dışında java.lang.String örneğini kaldırılamıyor; satır: 1, sütun: 54] (referans zinciri ile: com.springboot.domain.User ["firstName"]). Ben bu "firstName": inputFirstName[0] sonra .value yazmayı unuttum fark kadar

Ve bir saat gibi başımı çarptım. Bu sorundan dolayı

var newUserInfo = { "lastName": inputLastName[0].value, "userName": inputUsername[0].value, 
"firstName": inputFirstName[0].value , "email": inputEmail[0].value} 

buraya gelip ben sefaletin başkasının saat kurtaracak umut:

Yani, doğru çözüm oldu.

Cheers :)