gson 异常错误:怎么解决呢?

waxmsbnn  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(197)

我想从外部API获取国家的详细信息,并使用Gson将从get请求中接收到的数据设置为Country类。问题是在响应中,货币键的值介于[]之间(请参见下文),并且在某些情况下,货币名称值之间存在空格,这会导致以下错误 com.google.gson.stream.MalformedJsonException:第1行第41列路径$.currencies[0]处的对象未终止。name
“货币”:[{“代码”:“BGN”,“名称”:“保加利亚列弗”,“符号”:“лв"}]

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

如何仅获取货币代码?

4si2a6ki

4si2a6ki1#

看起来您对响应进行了两次解析;使用restTemplate.getForObject调用一次,然后将其结果转换为String(toString()调用的结果很可能是而不是JSON),然后尝试使用Gson再次解析它。
如果只想使用Gson,可以在fromJson调用中使用TypeToken来解析响应JSON数组:

List<Country> countries = gson.fromJson(..., new TypeToken<List<Country>>() {}.getType());

也许更熟悉Spring的人也可以解释如何只使用RestTemplate.getForObject而不是Gson。

相关问题