0

我正在开发一个 Spring Boot 应用程序,我遇到了以下问题。我必须从从 REST 调用中检索到的 JSON 输出中设置简单 DTO 对象的值。

基本上我正在调用这个GET API:https ://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=eur

如您所见,它返回如下 JSON 响应:

{
    "ethereum": {
        "eur": 2509.13
    }
}

所以我有这个CoingeckoPriceDTO类:

@Getter

@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CoingeckoPriceDTO {
    
    String coin;
    BigDecimal price;
    
}

然后我有这个服务方法:

@Service
@Log
public class CoingeckoInfoServiceImpl implements CoingeckoInfoService {
    
    @Autowired
    private RestTemplate restTemplate;
    
    String coinPriceApiUrl = "https://api.coingecko.com/api/v3/simple/price?ids={coinName}&vs_currencies={targetCurrency}";
    
    
    @Override
    public CoingeckoPriceDTO getCoinPrice(String coinName, String targetCurrency) {
        
        CoingeckoPriceDTO result = new CoingeckoPriceDTO();
        
        String completeUrl = this.coinPriceApiUrl.replace("{coinName}", coinName).replace("{targetCurrency}", targetCurrency);
        
        log.info("completeUrl: " + completeUrl);
        
        String responseStr = this.restTemplate.getForObject(completeUrl, String.class);
        
        log.info("responseStr: " + responseStr);
        
        
        return result;
    }
    
}

它只是通过REST模板执行调用,然后将其打印为字符串,实际上它将包含预期 JSON 响应的字符串打印为字符串:

responseStr: {"ethereum":{"eur":2499.04}}

现在我的问题是将这些值放入之前的CoingeckoPriceDTO字段中。我认为我需要做一些 JSON 操作来做到这一点:

特别是我必须使用返回的 JSON 检索的以太坊字符串设置我的 DTO字符串硬币字段(请注意,这不是字段值,而是字段名称。我不知道如何保留它并将其放入我的 DTO对象字段)。然后我必须使用 JSON 中的eur值设置我的 DTO BigDecimal 价格字段。

我怎样才能实现这样的行为?

4

1 回答 1

0

尝试将您的课程更改为以下内容:

   public class CoingeckoPriceDTO {

        private String coin;

        @JsonAlias({"eur", "dol", "sek", "etc"})
        private BigDecimal price;

        public String getCoin() {
            return coin;
        }

        public void setCoin(String coin) {
            this.coin = coin;
        }

        public BigDecimal getPrice() {
            return price;
        }

        public void setPrice(BigDecimal price) {
            this.price = price;
        }
    }

将您打算包含的任何货币添加到 @JsonAlias。

并继续做这样的事情:

public CoingeckoPriceDTO getCoinPrice(String coinName, String targetCurrency) throws JsonProcessingException {
    String completeUrl = coinPriceApiUrl.replace("{coinName}", coinName).replace("{targetCurrency}", targetCurrency);
    String responseStr = this.restTemplate.getForObject(completeUrl, String.class);
    JSONObject jsonObject = new JSONObject(responseStr);
    responseStr = jsonObject.getString("ethereum");

    ObjectMapper mapper = new ObjectMapper();
    CoingeckoPriceDTO result = mapper.readValue(responseStr, CoingeckoPriceDTO.class);

    result.setCoint(targetCurrency);

    return result;
}

我还没有运行代码来查看它是否真的有效,但如果需要,您可以进行调整。

于 2022-03-04T13:17:26.057 回答