我想使用 spring boot 撰寫一些 java 代碼來使用來自特定端點的 JSON 資料。但是,對于每個請求,回應可能會回傳不同的資料欄位。
{"success":true,"terms":"https:\/\/coinlayer.com\/terms","privacy":"https:\/\/coinlayer.com\/privacy","timestamp":1645616586,"target":"USD","rates":{"BTC":39049.424242}}
{"success":true,"terms":"https:\/\/coinlayer.com\/terms","privacy":"https:\/\/coinlayer.com\/privacy","timestamp":1645626666,"target":"USD","rates":{"BTC":39061.184046,"ETH":2726.545731}}
{"success":true,"terms":"https:\/\/coinlayer.com\/terms","privacy":"https:\/\/coinlayer.com\/privacy","timestamp":1645626966,"target":"USD","rates":{"ADA":0.939301,"BTC":39006.990707,"ETH":2720.502765}}
等等。
下面是我當前處理第一個案例的代碼。我可以撰寫另一個 Rates.java 來滿足第二種情況,依此類推,但我希望有一個 Rates.java 檔案來處理所有可能的情況。
LiveData.java
package com.example.consumingrest;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class LiveData {
private Boolean success;
private String terms;
private String privacy;
private Long timestamp;
private String target;
private Rates rates;
public LiveData() {
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getTerms() {
return terms;
}
public void setTerms(String terms) {
this.terms = terms;
}
public String getPrivacy() {
return privacy;
}
public void setPrivacy(String privacy) {
this.privacy = privacy;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getTarget() {
return target;
}
public void setTarget(String target) {
this.target = target;
}
public Rates getRates() {
return rates;
}
public void setValue(Rates rates) {
this.rates = rates;
}
@Override
public String toString() {
return "LiveData{"
"success='" success '\''
"terms='" terms '\''
"privacy='" privacy '\''
"timestamp='" timestamp '\''
"target='" target '\''
"rates=" rates
'}';
}
}
Rates.java
package com.example.consumingrest;
import java.math.BigDecimal;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Rates {
@JsonProperty(value = "BTC")
private BigDecimal btc;
public Rates() {
}
public BigDecimal getBTC() {
return this.btc;
}
public void setId(BigDecimal btc) {
this.btc = btc;
}
@Override
public String toString() {
return "{"
"BTC='" btc '\''
'}';
}
}
ConsumingRest.java(主要)
package com.example.consumingrest;
import java.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class ConsumingRestApplication {
private static final Logger log = LoggerFactory.getLogger(ConsumingRestApplication.class);
public static void main(String[] args) {
SpringApplication.run(ConsumingRestApplication.class, args);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
return args -> {
LiveData liveData = restTemplate.getForObject(
"http://api.coinlayer.com/api/live?access_key=121a4df8b95fd5be872da3bad101cd73&target=EUR&symbols=BTC", LiveData.class);
log.info(liveData.toString());
};
}
}
uj5u.com熱心網友回復:
如評論中所述,您似乎想要一張包含費率的地圖:
@JsonIgnoreProperties(ignoreUnknown = true)
public class LiveData {
...
private Map<String, BigDecimal> rates;
請參閱映射動態 JSON 物件
uj5u.com熱心網友回復:
任何 Json Object 都可以決議為Map<String, Object>Object 可以是任何東西,包括Mapor List。因此,您的地圖可以嵌套任何深度,并且它可以包含帶有任何物件的串列,包括地圖。您的任何回應都可以始終決議為該結構。因此,回傳該結構,您就不必擔心不同的格式 - 這是一種適合所有人的尺寸。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/432220.html
上一篇:SpringJackson驗證輸入欄位是有效的JSON
下一篇:com.fasterxml.jackson.databind.JsonMappingException:應用程式被標記為非空但為空
