2011-08-09 75 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,但沒有任何區別。 –