我试图反序列化一些JSON代表一个进程,其中一个进程可以有多个子进程。父进程正在创建并正确填充。但是,子进程列表中的对象按预期方式创建,但这些对象未被填充。使用GSON反序列化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并通过解析器运行它按预期工作。
有没有我失踪的一些步骤?
任何帮助,将不胜感激。
将接口添加到接口没有帮助。我相信GSON直接访问属性。我修复了实现类中的属性以匹配。将parentProcess更改为parentProcessId,但没有任何区别。 –