2014-07-21 4 views
29

kann nicht deserialisiert werden Ich habe Resturl, die mir alle Länder gibt - http://api.geonames.org/countryInfoJSON?username=volodiaL.Konnte JESON nicht lesen: Instanz von hello.Country [] aus START_OBJECT-Token

Ich benutze RestTemplate aus Feder 3 zurück json in Java-Objekte zu analysieren:

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

Wenn ich diesen Code ausführen erhalte ich eine Ausnahme:

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 

schließlich mein Land Klasse:

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; 
    } 
} 

Das Problem ist, dass zurückgegebene JSON Root-Element "geonames" enthält, die a enthält rray von Land Elementen wie so:

{ 
"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" 
    } 
] 
} 

Wie RestTemplate zu sagen, jedes Element des Arrays in Country Objekt zu konvertieren?

Antwort

34

Sie müssen folgendes tun:

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(); 

Es wäre toll, wenn Sie irgendeine Art von Anmerkung verwenden könnte, damit Sie Ebenen überspringen, aber es ist noch nicht möglich (siehe this und this)

+0

Sie sind die Besten! Es funktioniert –

+0

Froh, das zu hören! – geoand

+0

dies funktionierte nicht für mich, immer noch verursacht durch: com.fasterxml.jackson.databind.JsonMappingException: Die Instanz von java.util.ArrayList kann nicht aus dem START_OBJECT Token – java1977

9

eine andere Lösung:

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

Verwendung eines generischen Object -Liste mein Problem gelöst, ein Es gab auch andere Datentypen wie Boolean.

+0

Das funktioniert für mich, aber es ist eine Art Arbeit um, ich habe es immer noch nicht verstanden, warum es Ausnahmefehler beim Versuch, das JSON-Objekt in Land-Objekt –

0

für Frühlings-Boot 1.3.3 die Methode Austausch() für Liste ist wie im Stand der Antwort

Spring Data Rest - _links

+0

zuordnen bitte werfen Sie bitte Sinn Informationen in den Beitrag. ** Nur der Link ** als Antwort wird in StackOverflow abgeraten. – Raju

2

In meinem Fall arbeitet, war ich Wert von <input type="text"> mit JQuery bekommen und ich habe es wie folgt:

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

Und ich war ständig diese Ausnahme immer

com.fasterxml.jackson.databind.JsonMappingException: Die Instanz von java.lang.String kann nicht aus dem START_OBJECT-Token bei [Quelle: [email protected]; Zeile: 1, Spalte: 54] (über die Referenzkette: com.springboot.domain.User ["firstName"]).

Und ich schlug meinen Kopf für wie eine Stunde, bis ich erkannte, dass ich .value nach dieser "firstName": inputFirstName[0] schreiben vergessen.

Also, die richtige Lösung war:

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

ich hierher gekommen, weil ich dieses Problem hatte, und ich hoffe, dass ich jemanden andere Stunde Elend retten.

Prost :)

Verwandte Themen