java - 无法从 START_OBJECT token 中读取 JSON : Can not deserialize instance of hello. Country[]

标签 java spring resttemplate fasterxml

我有提供所有国家/地区的休息网址 - 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

最后是我的 Country 类:

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对象?

最佳答案

您需要执行以下操作:

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

如果您可以使用某种注释来跳过关卡,那就太好了,但目前还不可能(参见 thisthis)

关于java - 无法从 START_OBJECT token 中读取 JSON : Can not deserialize instance of hello. Country[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24864489/

相关文章:

java - 生日向导程序

java - 不能引用非最终变量和计时器

java - 如何使用 Spring RestTemplate 在 GET 调用中传入 Java 列表以在 Controller 中使用

java - 配置 Hazelcast CPSubsystem 重试超时

java - 找不到元素 'ehcache' 的声明

java - 如何删除 Spring 的 RestTemplate 添加的某些 HTTP header ?

java - 如何在没有uri的情况下将查询传递给rest模板中的url

java - Jooq CustomTypes 生成默认类型 POJO

java - ANTLR以递归方式替换token

java - 哪个应用层负责提供对外服务集成能力?