Десериализация свойства списка JSON с помощью GSON - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь десериализовать некоторый 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 и прогоню его через анализатор, он будет работать как положено.

Есть какой-то шаг, который я пропускаю?

Буду признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 10 августа 2011

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 голосов
/ 09 августа 2011

Попробуйте добавить сеттеры в интерфейс ProcessInstanceSummary, чтобы он мог задавать свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...