Spring开发货币计算器:从外部API JSON数组获取mid值失败求助
问题:Spring中解析JSON数组提取mid字段失败
接触Spring框架后,我基于外部API开发货币计算器,但从JSON数组提取数据时遇到问题,无法从OpenCurrencyRatesDto.java中获取“mid”字段的数据。开发环境是IntelliJ IDEA + Gradle,相关信息如下:
相关代码
CurrencyClient.java
package com.arturu.currencycalculator1.client.currency; import com.arturu.currencycalculator1.model.currencyDTO; import com.arturu.currencycalculator1.webclient.currency.dto.OpenCurrencyCurrencyDto; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @Component public class CurrencyClient { private static final String NBP_PL = "http://api.nbp.pl"; private RestTemplate restTemplate = new RestTemplate(); public currencyDTO getCurrencyValue(String symbol) { OpenCurrencyCurrencyDto openCurrencyCurrencyDto = callGetMethod("/api/exchangerates/rates/a/{symbol}/?format=json", OpenCurrencyCurrencyDto.class, symbol); return currencyDTO.builder() .mid(openCurrencyCurrencyDto.getRates().getMid()) .build(); } private <T> T callGetMethod(String url, Class<T> responseType, Object...objects) { return restTemplate.getForObject(NBP_PL + url, responseType, objects); } }
OpenCurrencyCurrencyDto.java
package com.arturu.currencycalculator1.webclient.currency.dto; import lombok.Getter; @Getter public class OpenCurrencyCurrencyDto { private OpenCurrencyRatesDto rates; }
OpenCurrencyRatesDto.java
package com.arturu.currencycalculator1.webclient.currency.dto; import lombok.Getter; @Getter public class OpenCurrencyRatesDto { private double mid; }
API返回结构

报错信息

ERROR 16640 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/]. [dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.web.client.RestClientException: Error while extracting response for type [class com.arturu.currencycalculator1.webclient.currency.dto.OpenCurrencyCurrencyDto] and content type [application/json;charset=utf-8]] with root cause
解决方案
问题核心是DTO类与API返回的JSON结构不匹配:API返回的rates是JSON数组,但你在OpenCurrencyCurrencyDto中将其定义为单个对象,导致RestTemplate无法完成反序列化,抛出异常。
修改步骤如下:
- 调整
OpenCurrencyCurrencyDto.java的字段类型,将rates改为列表:
package com.arturu.currencycalculator1.webclient.currency.dto; import lombok.Getter; import java.util.List; @Getter public class OpenCurrencyCurrencyDto { private List<OpenCurrencyRatesDto> rates; // 改为List类型匹配数组结构 }
- 修改
CurrencyClient.java中的取值逻辑,从列表中取出对应元素的mid值(根据API返回结构,rates数组通常仅包含一个有效对象):
public currencyDTO getCurrencyValue(String symbol) { OpenCurrencyCurrencyDto openCurrencyCurrencyDto = callGetMethod("/api/exchangerates/rates/a/{symbol}/?format=json", OpenCurrencyCurrencyDto.class, symbol); // 从rates列表中获取第一个元素的mid字段 double midValue = openCurrencyCurrencyDto.getRates().get(0).getMid(); return currencyDTO.builder() .mid(midValue) .build(); }
调整后RestTemplate可正确解析JSON数组,即可顺利获取mid字段的值。
内容的提问来源于stack exchange,提问作者arturu007
相关产品推荐
相关产品推荐

