Мне нужно проанализировать входящие сообщения json в объекты Java с помощью Gson.
Класс "MessageBody" должен использоваться для подачи Gson.fromJson (json, MessageBody.class);
Сообщение json выглядит следующим образом.
На первом уровне есть три статических поля. Третье поле («поля») представляет собой список объектов «DataField».
Объект DataField имеет поле типа и значения.
Это значение может быть неоднородным. Ожидаемые типы: «String», «int», «boolean» и «HashMap ».
{
"eventId": "abc",
"customerId": "abc",
"fields": {
"eventDateTime": {
"type": "datetime",
"value": "2019-05-03T10:15:30Z"
},
"eventCorrelationID": {
"type": "string",
"value": "abc"
},
"additionalAttributes": {
"type": "collection",
"value": {
"additionalAttribute1": {
"value": "abc",
"type": "string"
},
"additionalAttribute2": {
"value": "abc",
"type": "string"
}
}
}
}
}
public class MessageBody {
private String eventId;
private String customerId;
private HashMap<String, DataField> fields;
public String getEventId() {
return eventId;
}
public void setEventId(String eventId) {
this.eventId = eventId;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public HashMap<String, DataField> getFields() {
return fields;
}
public void setFields(HashMap<String, DataField> fields) {
this.fields = fields;
}
public class DataField {
private Object value;
private String type;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}
Синтаксический анализ с использованием приведенного выше класса работает для всех объектов, кроме вложенного списка DataField в "AdditionalAttributes".
В результате получается объект LinkedHashTreeMap. К сожалению, невозможно преобразовать его в другой HashMap из DataFields.
Как можно обрабатывать вложенные / рекурсивные списки в разнородных объектах?
Как мне заставить работать следующее утверждение? : -)
HashMap<String, DataField> addAttrs = (HashMap<String, DataField>) messageBody.getFields().get("additionalAttributes").getValue();