ошибка com.google.gson.stream.MalformedJsonException: Как ее решить?

#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.