我有一些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进行纠正。
答案 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();
}