1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果一組屬性(我的意思是輸入數(shù)據(jù)的結(jié)構(gòu))是不可修改的,我們可以將它表示為一個(gè) POJO 類。讓它成為DetailsData:
public class DetailsData {
private String data;
private BigDecimal amount;
private List<MoneyValue> amountCurrencyList;
/*getters, setters, constructors*/
public DetailsData() {
}
@JsonProperty("amountCurrencyList")
private void deserializeMoneyValue(List<Map<String, Object>> data) {
if (Objects.isNull(amountCurrencyList)) {
amountCurrencyList = new ArrayList<>();
} else {
amountCurrencyList.clear();
}
MoneyValue moneyValue;
for (Map<String, Object> item : data) {
moneyValue = new MoneyValue(getValue(item.get("value")),
(String) item.get("currency"));
amountCurrencyList.add(moneyValue);
}
}
private BigDecimal getValue(Object value) {
BigDecimal result = null;
if (value != null) {
if (value instanceof BigDecimal) {
result = (BigDecimal) value;
} else if (value instanceof BigInteger) {
result = new BigDecimal((BigInteger) value);
} else if (value instanceof Number) {
result = new BigDecimal(((Number) value).doubleValue());
} else {
throw new ClassCastException("Invalid value");
}
}
return result;
}
}
如您所見,這是一個(gè)deserializeMoneyValue注釋為 JSON 屬性的方法。因此,對于 ObjectMapper,它將用作自定義反序列化器。getValue方法是必要的,因?yàn)?Jackson 以這種方式工作,因此值將在滿足值大小的類中反序列化。例如,如果 value = "100" 它將被反序列化為Integer,如果 value = "100.0" -Double等等。其實(shí)這個(gè)方法你可以制作static并移動(dòng)到一些util類中??偨Y(jié)一下,您可以buildDetailsFromJson通過以下方式進(jìn)行更改:
public void buildDetailsFromJson(String details) {
if (details != null) {
ObjectMapper mapper = new ObjectMapper();
try {
mapper.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
// assuming the eventDetails is an instance of DetailsData
eventDetails = mapper.readValue(details, DetailsData.class);
} catch (IOException e) {
log.error("Exception during JSON {} parsing! {}", details, e.getMessage());
}
}
}
和 EventDetail 類:
public class SomeEventDetails extends BaseEventDetails implements EventDetails {
private List<MoneyValue> amountCurrencyList;
@Override
public void setUpFieldsFromMap() {
this.amountCurrencyList = super.eventDetails.getAmountCurrencyList();
if (isNull(amountCurrencyList)) {
throw new InvalidOrMissingParametersException("Exception during JSON parsing! Critical data is missing in DetailsMap - " + super.eventDetails.toString());
}
}
}
添加回答
舉報(bào)