У меня есть пример JSON
{
"data":"some string data",
"amount":200,
"amountCurrencyList":[
{"value":4000.0,"currency":"USD"},
{"value":100.0,"currency":"GBP"}
]
}
и метод, который в настоящее время анализирует его в поле карты базового объекта
public void buildDetailsFromJson(String details) {
if (details != null) {
TypeReference<HashMap<String, Object>> mapTypeReference = new TypeReference<HashMap<String, Object>>() {
};
ObjectMapper mapper = new ObjectMapper();
try {
mapper.enable(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.disable(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES);
detailsMap = mapper.readValue(details, mapTypeReference);
} catch (IOException e) {
log.error("Exception during JSON {} parsing! {}", details, e.getMessage());
}
}
}
Структура JSON может быть изменена.Идея состоит в том, чтобы иметь отдельный метод, который в идеале легко извлекал бы необходимый параметр, например map.get(key_name)
, например
public void setUpFieldsFromMap() {
HashMap<String, Object> map = super.detailsMap;
this.amountCurrencyList = (ArrayList<MoneyValue>) map.get("amountCurrencyList");
if (isNull(amountCurrencyList)) {
throw new InvalidOrMissingParametersException("Exception during JSON parsing! Critical data is missing in DetailsMap - " + map.toString());
}
}
Таким образом, получая объект List по ключу и приводя его к нужному параметру.НО, когда я пытаюсь работать с List<MoneyValue>
System.out.println(detailsObj.getAmountCurrencyList().get(0).getValue());
, я получаю
Exception: java.util.LinkedHashMap cannot be cast to MoneyValue
Возможно ли на самом деле добиться того, чего я хочу, без жесткого кодирования TypeReference с такими точными параметрами, какTypeReference<HashMap<String, List<MoneyValue>>>
?
UPD
public class MoneyValue {
@NotNull
private BigDecimal value;
@NotNull
private String currency;
Класс EventDetails
public class SomeEventDetails extends BaseEventDetails implements EventDetails {
private ArrayList<MoneyValue> amountCurrencyList;
@Override
public void setUpFieldsFromMap() {
HashMap<String, Object> map = super.detailsMap;
this.amountCurrencyList = (ArrayList<MoneyValue>) map.get("amountCurrencyList");
if (isNull(amountCurrencyList)) {
throw new InvalidOrMissingParametersException("Exception during JSON parsing! Critical data is missing in DetailsMap - " + map.toString());
}
}
}