2011-08-09 37 views
0

我试图反序列化一些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并通过解析器运行它按预期工作。

有没有我失踪的一些步骤?

任何帮助,将不胜感激。

回答

0

好的。我修好了它。事实证明,你需要确保列表generic被设置为实现。见下:

public class ProcessInstanceSummaryImpl implements ProcessInstanceSummary { 

    private String name; 
    private Long id; 
    private Map<String, Object> processVariables; 
    private List<HumanTask> openTasks; 
    private List<ProcessInstanceSummaryImpl> subProcesses; 
    private Long parentProcessId; 

    /* 
     No arg constructor here 
     Getters and setters here. 
    */ 

} 
0

尝试将设置器添加到ProcessInstanceSummary接口,以便它可以设置属性。

+0

将接口添加到接口没有帮助。我相信GSON直接访问属性。我修复了实现类中的属性以匹配。将parentProcess更改为parentProcessId,但没有任何区别。 –