我想創建一個映射此 JSON 物件的 Java 物件:
{
"base_currency_code": "HKD",
"base_currency_name": "Hong Kong dollar",
"amount": "150.5800",
"updated_date": "2022-03-20",
"rates": {
"GBP": {
"currency_name": "Pound sterling",
"rate": "0.0975",
"rate_for_amount": "14.6774"
}
},
"status": "success"
}
只有"GBP"屬性名稱是動態欄位,下次可能是另一個貨幣符號"USD","JPY"等等。
我這樣創建 Java 類:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"base_currency_code",
"base_currency_name",
"amount",
"updated_date",
"rates",
"status"
})
public class CurrencyConvertDto {
@JsonProperty("base_currency_code")
private String baseCurrencyCode;
@JsonProperty("base_currency_name")
private String baseCurrencyName;
@JsonProperty("amount")
private String amount;
@JsonProperty("updated_date")
private String updatedDate;
@JsonProperty("rates")
private Rates rates;
@JsonProperty("status")
private String status;
/*
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
*/
@JsonProperty("base_currency_code")
public String getBaseCurrencyCode() {
return baseCurrencyCode;
}
@JsonProperty("base_currency_code")
public void setBaseCurrencyCode(String baseCurrencyCode) {
this.baseCurrencyCode = baseCurrencyCode;
}
@JsonProperty("base_currency_name")
public String getBaseCurrencyName() {
return baseCurrencyName;
}
@JsonProperty("base_currency_name")
public void setBaseCurrencyName(String baseCurrencyName) {
this.baseCurrencyName = baseCurrencyName;
}
@JsonProperty("amount")
public String getAmount() {
return amount;
}
@JsonProperty("amount")
public void setAmount(String amount) {
this.amount = amount;
}
@JsonProperty("updated_date")
public String getUpdatedDate() {
return updatedDate;
}
@JsonProperty("updated_date")
public void setUpdatedDate(String updatedDate) {
this.updatedDate = updatedDate;
}
@JsonProperty("rates")
public Rates getRates() {
return rates;
}
@JsonProperty("rates")
public void setRates(Rates rates) {
this.rates = rates;
}
@JsonProperty("status")
public String getStatus() {
return status;
}
@JsonProperty("status")
public void setStatus(String status) {
this.status = status;
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Rates {
private List<Map<String, String>> rateInfo = new ArrayList<Map<String, String>>();
@JsonAnySetter
public void setDynamicProperty(String name, Map<String, String> map) {
rateInfo.add(map);
}
public List<Map<String, String>> getRateInfo() {
return rateInfo;
}
public void setRateInfo(List<Map<String, String>> rateInfo) {
this.rateInfo = rateInfo;
}
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"currency_name",
"rate",
"rate_for_amount"
})
public class RateInfo {
@JsonProperty("currency_name")
private String currencyName;
@JsonProperty("rate")
private String rate;
@JsonProperty("rate_for_amount")
private String rateForAmount;
/*
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
*/
@JsonProperty("currency_name")
public String getCurrencyName() {
return currencyName;
}
@JsonProperty("currency_name")
public void setCurrencyName(String currencyName) {
this.currencyName = currencyName;
}
@JsonProperty("rate")
public String getRate() {
return rate;
}
@JsonProperty("rate")
public void setRate(String rate) {
this.rate = rate;
}
@JsonProperty("rate_for_amount")
public String getRateForAmount() {
return rateForAmount;
}
@JsonProperty("rate_for_amount")
public void setRateForAmount(String rateForAmount) {
this.rateForAmount = rateForAmount;
}
}
但是編譯的時候好像有問題。它無法將 JSON 物件與動態欄位映射。有誰知道如何修理它?非常感謝你。
uj5u.com熱心網友回復:
您可以使用 @JsonAnyGetter 并在 Map 中獲取附加的動態鍵值對。請參考以下示例中@JsonAnyGetter 的用法,如果您仍需要幫助,請告訴我。
https://www.logicbig.com/tutorials/misc/jackson/jackson-any-setter.html
uj5u.com熱心網友回復:
可能你在這里想得太復雜了。在你的CurrencyConvertDto課堂上,而不是使用
@JsonProperty("rates")
private Rates rates;
你可以簡單地使用
@JsonProperty("rates")
private Map<String, RateInfo> rates;
(當然也相應地調整getRates和setRates方法)。然后你就不再需要Rates上課了。
杰克遜可以開箱即用地應對這種情況,即使您將來可能會有更多的費率,例如:
{
"base_currency_code": "HKD",
"base_currency_name": "Hong Kong dollar",
"amount": "150.5800",
"updated_date": "2022-03-20",
"rates": {
"GBP": {
"currency_name": "Pound sterling",
"rate": "0.0975",
"rate_for_amount": "14.6774"
},
"EUR": {
"currency_name": "Euro",
"rate": "0.120",
"rate_for_amount": "18.07"
}
},
"status": "success"
}
順便說一句:您不需要@JsonProperty
在 getter 和 setter 方法上重復注釋。只放在@JsonProperty
成員變數上就足夠了。
uj5u.com熱心網友回復:
如果可以,最簡單的選擇是使用合理的 JSON 設計。
這是一個例子:
{
"base_currency_code": "HKD",
"base_currency_name": "Hong Kong dollar",
"amount": "150.5800",
"updated_date": "2022-03-20",
"rates": {
"currentySymbol": "GBP",
"currency_name": "Pound sterling",
"rate": "0.0975",
"rate_for_amount": "14.6774"
}
},
"status": "success"
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/446007.html
上一篇:垃圾收集器與IOC
