You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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返回结构

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无法完成反序列化,抛出异常。

修改步骤如下:

  1. 调整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类型匹配数组结构
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 02:10:25