40

私はすべての国を提供する残りのURLを持っています - http://api.geonames.org/countryInfoJSON?username=volodiaL

Spring 3 の RestTemplate を使用して、返された json を解析して Java オブジェクトに変換します。

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

このコードを実行すると、例外が発生します。

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of hello.Country[] out of START_OBJECT token
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1846149; 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

最後に私の国クラス:

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

問題は、返された json に、次のような国要素の配列を含むルート要素「geonames」が含まれていることです。

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

配列の各要素をオブジェクトRestTemplateに変換する方法を教えてください。Country

4

5 に答える 5

43

次のことを行う必要があります。

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

何らかの注釈を使用してレベルをスキップできるようにできれば素晴らしいことですが、まだそれはできません (これこれを参照してください) 。

于 2014-07-21T12:07:27.053 に答える
9

別の解決策:

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

Boolean のような他のデータ型もあったため、一般的なObject -Listを使用すると問題が解決しました。

于 2015-02-05T16:59:08.193 に答える
4

私の場合、<input type="text">JQuery で値を取得していましたが、次のようにしました。

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

そして、私は常にこの例外を受け取っていました

com.fasterxml.jackson.databind.JsonMappingException: [ソース: java.io.PushbackInputStream@39cb6c98; で START_OBJECT トークンから java.lang.String のインスタンスをデシリアライズできません。行: 1、列: 54] (参照チェーン経由: com.springboot.domain.User["firstName"])。

.valueそして、この後書くのを忘れたことに気付くまで、1時間ほど頭を叩きました"firstName": inputFirstName[0]

したがって、正しい解決策は次のとおりです。

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

私はこの問題を抱えていたのでここに来ました。他の誰かの悲惨な時間を救ってくれることを願っています.

乾杯 :)

于 2017-05-31T17:31:42.090 に答える
0

Spring-boot 1.3.3 の場合、 List のメソッド exchange() は関連する回答のように機能しています

Spring データレスト - _links

于 2016-03-25T09:00:59.583 に答える