2011-08-09 8 views
0

프로세스에 여러 개의 하위 프로세스가있을 수있는 프로세스를 나타내는 일부 JSON을 deserialize하려고합니다. 상위 프로세스가 제대로 작성 및 채워집니다. 그러나 하위 프로세스 목록에는 예상대로 개체가 만들어 지지만 이러한 개체는 채워지지 않습니다. 여기 GSON을 사용하여 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. 
    */ 

} 
여기

내 JSON입니다 toObject를 호출하면 다음과 같다 때 16,

확인 결과, 그래서 내가 다시 얻을 :

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

속성을 설정할 수 있도록 Setter를 ProcessInstanceSummary 인터페이스에 추가해보십시오.

+0

인터페이스에 세터를 추가해도 도움이되지 않았습니다. 어쨌든 GSON이 부동산에 직접 접근한다고 생각합니다. 나는 그것과 일치하도록 구현 클래스의 속성을 수정했다. parentProcess를 parentProcessId로 변경했으며 아무런 차이가 없습니다. –

관련 문제