Я пытаюсь десериализовать некоторый JSON, представляющий процесс, где процесс может иметь несколько подпроцессов. Родительский процесс создается и заполняется правильно. Однако в списке подпроцессов объекты созданы должным образом, но эти объекты не заполнены.
Вот мой JSON:
{ "name":"net.sample.parent",
"id":19,
"subProcesses":[{
"name":"net.sample.child",
"id":21,
"subProcesses":[],
"processVariables":{},
"openTasks":null,
"parentProcessId":null}],
"processVariables":{
"id":1,
"startDate":"Aug 28, 2010 12:00:00 AM",
"budget":10000.0,
"userName":"mary",
"endDate":"Aug 28, 2011 12:00:00 AM"},
"openTasks":null,
"parentProcessId":null}
Вот мой код, который создает GsonBuilder:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(ProcessInstanceSummary.class, new ProcessInstanceCreator());
gsonBuilder.registerTypeAdapter(HumanTask.class, new TaskInstanceCreator());
gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer());
public class TaskInstanceCreator implements InstanceCreator<HumanTask> {
public HumanTask createInstance(Type type) {
return new SimpleHumanTask();
}
}
public class ProcessInstanceCreator implements InstanceCreator<ProcessInstanceSummary> {
public ProcessInstanceSummary createInstance(Type type) {
return new ProcessInstanceSummaryImpl();
}
}
private class DateDeserializer implements JsonDeserializer<Date> {
public Date deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
JsonPrimitive asJsonPrimitive = json.getAsJsonPrimitive();
return new Date(asJsonPrimitive.getAsLong());
}
}
Интерфейс
public interface ProcessInstanceSummary {
String getName();
Long getId();
Map<String, Object> getProcessVariables();
List<HumanTask> getOpenTasks();
List<ProcessInstanceSummary> getSubProcesses();
Long getParentProcessId();
}
Реализация:
public class ProcessInstanceSummaryImpl implements ProcessInstanceSummary {
private String name;
private Long id;
private Map<String, Object> processVariables;
private List<HumanTask> openTasks;
private List<ProcessInstanceSummary> subProcesses;
private Long parentProcess;
/*
No arg constructor here
Getters and setters here.
*/
}
ОК, поэтому результат, который я получаю при вызове toObject, выглядит следующим образом:
dto ProcessInstanceSummaryImpl (id=39)
id Long (id=71)
name "net.sample.parent" (id=74)
openTasks null
parentProcess null
processVariables LinkedHashMap<K,V> (id=75)
subProcesses ArrayList<E> (id=57)
elementData Object[10] (id=66)
[0] ProcessInstanceSummaryImpl (id=69)
id null
name null
openTasks null
parentProcess null
processVariables null
subProcesses null
[1] null
[2] null
[3] null
[4] null
[5] null
[6] null
[7] null
[8] null
[9] null
modCount 1
size 1
Как видите, объект правильного типа был создан и добавлен в список подпроцессов, но ни одно из свойств не было заполнено.
Если я просто возьму подпроцесс JSON и прогоню его через анализатор, он будет работать как положено.
Есть какой-то шаг, который я пропускаю?
Буду признателен за любую помощь.