2011-08-09 10 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. 
    */ 

} 

OK、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

OK。それを私が直した。リストジェネリックが実装に設定されていることを確認する必要があることが分かります。以下を参照してください:

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に変更しました。違いはありません。 –

関連する問題