我正在尝试从天气 apishka 获得响应 apishka 向城市坐标请求发送这样的响应
[
{
"name": "Moscow",
"local_names": {
"it": "Mosca",
"zh": "莫斯科",
"lv": "Maskava",
"id": "Moskwa",
"ay": "Mosku",
"lt": "Maskva",
"ascii": "Moscow",
"sh": "Moskva",
"uz": "Moskva",
"st": "Moscow",
"co": "Moscù",
"bo": "མོ་སི་ཁོ།",
"fi": "Moskova",
"wo": "Mosku",
"dz": "མོསི་ཀོ",
"sl": "Moskva",
"ps": "مسکو",
"sc": "Mosca",
"hr": "Moskva",
"kv": "Мӧскуа",
"tk": "Moskwa",
"sr": "Москва",
"mg": "Moskva",
"ko": "모스크바",
"wa": "Moscou",
"sg": "Moscow",
"sv": "Moskva",
"ch": "Moscow",
"mn": "Москва",
"ta": "மாஸ்கோ",
"am": "ሞስኮ",
"an": "Moscú",
"io": "Moskva",
"su": "Moskwa",
"ro": "Moscova",
"oc": "Moscòu",
"feature_name": "Moscow",
"bg": "Москва",
"nn": "Moskva",
"en": "Moscow",
"li": "Moskou",
"ga": "Moscó",
"ak": "Moscow",
"ba": "Мәскәү",
"da": "Moskva",
"so": "Moskow",
"ru": "Москва",
"be": "Масква",
"is": "Moskva",
"eo": "Moskvo",
"cu": "Москъва",
"uk": "Москва",
"cs": "Moskva",
"sk": "Moskva",
"vo": "Moskva",
"ab": "Москва",
"qu": "Moskwa",
"kg": "Moskva",
"cy": "Moscfa",
"az": "Moskva",
"pl": "Moskwa",
"jv": "Moskwa",
"fo": "Moskva",
"ia": "Moscova",
"lg": "Moosko",
"hu": "Moszkva",
"vi": "Mát-xcơ-va",
"eu": "Mosku",
"mt": "Moska",
"nb": "Moskva",
"pt": "Moscou",
"tl": "Moscow",
"ar": "موسكو",
"he": "מוסקווה",
"gv": "Moscow",
"sw": "Moscow",
"de": "Moskau",
"gd": "Moscobha",
"ja": "モスクワ",
"yo": "Mọsko",
"dv": "މޮސްކޯ",
"cv": "Мускав",
"bi": "Moskow",
"fa": "مسکو",
"gn": "Mosku",
"no": "Moskva",
"iu": "ᒨᔅᑯ",
"na": "Moscow",
"bs": "Moskva",
"kk": "Мәскеу",
"ml": "മോസ്കോ",
"zu": "IMoskwa",
"za": "Moscow",
"ca": "Moscou",
"hi": "मास्को",
"ln": "Moskú",
"la": "Moscua",
"mi": "Mohikau",
"av": "Москва",
"gl": "Moscova - Москва",
"es": "Moscú",
"os": "Мæскуы",
"af": "Moskou",
"se": "Moskva",
"ht": "Moskou",
"nl": "Moskou",
"kn": "ಮಾಸ್ಕೋ",
"yi": "מאסקווע",
"ty": "Moscou",
"br": "Moskov",
"el": "Μόσχα",
"ce": "Москох",
"tt": "Мәскәү",
"tr": "Moskova",
"ku": "Moskow",
"te": "మాస్కో",
"ie": "Moskwa",
"sq": "Moska",
"et": "Moskva",
"ss": "Moscow",
"hy": "Մոսկվա",
"tg": "Маскав",
"kl": "Moskva",
"kw": "Moskva",
"mr": "मॉस्को",
"ka": "მოსკოვი",
"ky": "Москва",
"fr": "Moscou",
"my": "မော်စကိုမြို့",
"sm": "Moscow",
"fy": "Moskou",
"mk": "Москва",
"ms": "Moscow",
"th": "มอสโก",
"ug": "Moskwa",
"ur": "ماسکو",
"bn": "মস্কো"
},
"lat": 55.7504461,
"lon": 37.6174943,
"country": "RU",
"state": "Moscow"
}
]
但作为回应,我得到了这样的例外
Exception in thread "main" org.springframework.web.client.RestClientException: Error while extracting response for type [class com.romanperkov.spring.rest.entity.cord] and content type [application/json;charset=utf-8]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.romanperkov.spring.rest.entity.cord` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.romanperkov.spring.rest.entity.cord` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 1]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:120)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:741)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:674)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:315)
at com.romanperkov.spring.rest.Communication.test(Communication.java:81)
at com.romanperkov.spring.rest.App.main(App.java:35)
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `com.romanperkov.spring.rest.entity.cord` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.romanperkov.spring.rest.entity.cord` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 1]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:284)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:242)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:105)
... 5 more
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.romanperkov.spring.rest.entity.cord` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1190)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:604)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:190)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:166)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3521)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:273)
... 7 more
Process finished with exit code 1
我了解问题是apishka的响应以方括号开头,即它返回一个数组,但它没有名称,这种情况下如何进行?
描述要从响应 API 获取的实体的类
@Getter
@Setter
@NoArgsConstructor
public class cord {
private List<String> name;
}
问题的解决方法是将类指定为数组
String url="http://api.openweathermap.org/geo/1.0/direct?q=QWERTY&limit=5&appid=fe7e6bcec3fedc63d4a158abd1c3c3eb";
cord[] responseEntity=restTemplate.getForObject
(url.replace("QWERTY","москва"), cord[].class);
System.out.println(responseEntity[0]);
模型
描述我们要提取的对象
本地化的城市名称更容易融入
Map<String, String>为了不违反约定并按应有的方式调用变量 CamelCase,而不是 JSON 中的 snake_case,我们将使用 JSON 中的字段名称在字段上添加注释
为了更方便地使用 Map 中的本地化名称,您可以添加一个辅助方法,通过区域设置代码提取所需的名称
因此,要获得法语名称,您需要调用:
全班:
萃取
从 JSON 中提取对象最不愉快的时刻是参数化类型(它们是泛型)
在我们的例子中,对象列表直接返回给我们,我们必须以某种方式确定类型。
我们
List.class无法指定。对于此类任务,Jackson 有一个类型工厂,可以帮助您创建基于集合类和嵌套对象类的泛型类型描述
从 json 中提取对象的实际代码
一切都正确检索。
这是从调试器中提取的示例:
更新
На момент начала написания ответа кода с RestTemplate в вопросе не было, поэтому дополняю вариант с онным.
Конкретно в случае с
RestTemplateтип лучше указывать с помощью вспомогательного класса Spring'а, предназначенного ровно для того же что и вышеописанная фабрика.В Spring есть класс
ParameterizedTypeReferenceс помощью которого можно описать тип параметризируемого объекта (или дженерика)Делается это так:
при этом данный тип можно пристроить далеко не в каждый метод RestTemplate.
Лучше всего воспользоваться следующим способом:
В итоге код получения и извлечения объектов из REST'сервиса будет выглядеть так:
注意:
在你的情况下,只会有一个类
City,而不是一个类coord。我没有举手那样称呼类,所以我从我提到的类似答案中取了名字。
类必须以大写字母命名。
这是一个约定。
不知怎的,我猜...
你想解析一个对象,你会得到一个列表。传递
TypeReferencecList<City>来解析列表: