#java #spring-boot #get #gson
Вопрос:
Я хочу получить сведения о стране из внешнего api и с помощью Gson установить данные, полученные из запроса get, в страну класса. Проблема в том, что в ответ валют ключ имеет значение, которое находится между [](см. ниже), а в некоторых случаях есть пространство между валютами имя значения, которое вызывает следующую ошибку ком.Гугл.дсын.трансляция.MalformedJsonException: объект незавершенной в строке 1 столбец 41 путь $.валюты[0].название:
«валюты»:[{«код»:»ЛВ»,»название»:»Болгарский лев»,»символ»:»лв»}]
@RestController
public class CountryController {
@Autowired
private RestTemplate restTemplate;
private static String baseURL = "https://restcountries.com/v2/";
public Object[] getCountryDetails(String countryName){
Object[] countryDetails = restTemplate.getForObject(baseURL "name/" countryName "?fields=name,alpha2Code,alpha3Code,capital,currencies", Object[].class);
return countryDetails;
}
public Country createCountryObject(String countryName) {
String response = Arrays.asList(getCountryDetails(countryName)).get(0).toString();
Gson g = new Gson();
JsonReader reader = new JsonReader(new StringReader(response.trim()));
reader.setLenient(true);
Country country = g.fromJson(reader, Country.class);
return country;
}
@GetMapping("/")
public String getAll(){
Country country = createCountryObject("bulgaria");
return country.getName();
}
}
Country.java:
package country.neighbours.tour.models;
import java.util.List;
public class Country {
private String name;
private String alpha2Code;
private String alpha3Code;
private List<String> borders;
private Object[] currencies;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getBorders() {
return borders;
}
public void setBorders(List<String> borders) {
this.borders = borders;
}
public String getAlpha2Code() {
return alpha2Code;
}
public void setAlpha2Code(String alpha2Code) {
this.alpha2Code = alpha2Code;
}
public String getAlpha3Code() {
return alpha3Code;
}
public void setAlpha3Code(String alpha3Code) {
this.alpha3Code = alpha3Code;
}
public Object[] getCurrencies() {
return currencies;
}
public void setCurrencies(Object[] currencies) {
this.currencies = currencies;
}
}
Как я могу получить только код валюты?
Ответ №1:
Похоже , вы анализируете ответ дважды; один раз с restTemplate.getForObject
помощью, затем вы преобразуете его результат в строку (результат вашего toString()
вызова, скорее всего, не JSON), а затем пытаетесь проанализировать его во второй раз с помощью Gson.
В случае, если вы хотите использовать только Gson, вы можете использовать a TypeToken
в fromJson
вызове для анализа массива JSON ответа:
List<Country> countries = gson.fromJson(..., new TypeToken<List<Country>>() {}.getType());
Возможно, кто-то, более знакомый с Spring, также может объяснить, как использовать только RestTemplate.getForObject
для этого вместо Gson.