如何使用Spring RestTemplate将嵌套数据映射到顶级是变量的bean?

时间:2020-06-18 18:24:35

标签: json spring-boot jackson resttemplate

我有一些JSON数据,如下所示。我看到了其他使用bean作为内部节点包装器的解决方案,但是在此数据中,顶级字符串不是命名参数(以下为“ TSLA”和“ LVS”)。

我想使用Spring RestTemplate并使用Lombok返回包含每个属性的getter和setter的Equity bean的实例。

{
  "TSLA": {
    "assetType": "EQUITY",
    "assetMainType": "EQUITY",
    "cusip": "88160R101",
    "symbol": "TSLA",
    "description": "Tesla, Inc.  - Common Stock",
    "bidPrice": 1001.88,
    "bidSize": 100,
    "bidId": "Q",
    "askPrice": 1002.17,
    "askSize": 100,
    "askId": "B",
    "lastPrice": 1001.88
  },
  "LVS": {
    "assetType": "EQUITY",
    "assetMainType": "EQUITY",
    "cusip": "517834107",
    "symbol": "LVS",
    "description": "Las Vegas Sands Corp. Common Stock",
    "bidPrice": 48.33,
    "bidSize": 200,
    "bidId": "P",
    "askPrice": 48.34,
    "askSize": 300,
    "askId": "P",
    "lastPrice": 48.33
  }
}

这是我的代码。 json.getBody()返回null,我得到了NPE。

public Optional<List<Equity>> getQuotes(final String... tickers) {

//redacted the URL string creation.  I get the correct data with the URL.

    try {
        final ResponseEntity<JsonNode> json = restTemplate.getForEntity(url, JsonNode.class);
        List<Equity> equities = new ArrayList<>(tickers.length);

        for (String ticker : tickers) {
            Equity equity = mapper.readValue(Objects.requireNonNull(json.getBody()).get(ticker).toString(),
                    Equity.class);
            equities.add(equity);
        }
        return Optional.of(equities);

    } catch (Exception e) {
        log.error("Could not retrieve quote for " + Arrays.toString(tickers), e);
    }
    return Optional.empty();
}

我尝试使用Jackson2,但没有任何效果。我知道此代码已关闭映射,但是我看不到如何用Spring进行纠正。

1 个答案:

答案 0 :(得分:0)

经过一番探索,我找到了一个不使用RestTemplate而是使用Jackson API的解决方案。它读取树并使用每个节点中的值创建对象。

public Optional<List<Equity>> getQuotes(final String... tickers) {
    //URL creation redacted

    try {
        JsonNode node = mapper.readTree(new URL(url));
        List<Equity> equities = new ArrayList<>(tickers.length);

        for (String ticker : tickers) {
            JsonNode topLevel = node.path(ticker);
            Equity equity = mapper.treeToValue(topLevel, Equity.class);
            equities.add(equity);
        }
        return Optional.of(equities);

    } catch (Exception e) {
        log.error("Could not retrieve quote for " + Arrays.toString(tickers), e);
    }
    return Optional.empty();
}