Инициализация полей класса из JSON с использованием Gson - PullRequest
1 голос
/ 03 января 2011

Я пытаюсь использовать Gson для инициализации своих полей, но безуспешно.

String complex = "{'menu': { 'id': 'file', 'value': 'File', 'popup': { 'task':
  [ {'value': 'New', 'onclick': 'CreateNewDoc()'}, {'value': 'Open', 'onclick': 'OpenDoc()'}, {'value': 'Close', 'onclick': 'CloseDoc()'}]
}}}";

Попытка сделать это с:

TasksHolder th = gson.fromJson(complex, TasksHolder.class);

Класс TaskHolder:

public class TasksHolder {

    List<Task> task;

    public TasksHolder() {
        task = new ArrayList<Task>();
    }
}

Пожалуйста, посоветуйте, что можно сделать, чтобы заполнить task из TaskHolder.

Ответы [ 2 ]

3 голосов
/ 03 января 2011

Проблема в стирании универсального типа. GSON не знает, какие объекты создавать, потому что ваш класс содержит только List (информация о типе, касающаяся Task, потеряна).

Вот как как решить эту проблему в GSON :

Type listType = new TypeToken<List<Task>>() {}.getType();
List<Task> tasks = gson.fromJson(myTasks, listType);

Но это вам не поможет, так как вам нужен родительский объект, а не только список. Боюсь, вам придется написать свои собственные методы пользовательской сериализации и десериализации

0 голосов
/ 04 января 2011

Ваш JSON не сопоставляется с определенным вами классом: в нем отсутствует пара уровней (объект основного уровня, у которого есть свойство 'menu', затем объект меню, который фактически содержит TaskHolder. Поэтому вы должны либо определить структуру класса, с которой JSON сопоставляется (как еще Gson узнает, что и где отображать?) или предварительно обработать JSON для удаления ненужных вещей.

Стирание типа, упомянутое в другом ответе, НЕ должно быть проблемой здесь: ваше свойство 'task' объявлено как List, и этого должно быть достаточно для Gson, чтобы определить универсальный тип. Да, объявления полей сохраняют информацию общего типа; стирание типов больше связано с информацией времени выполнения, доступной через Class. Таким образом, хотя ссылочные объекты типа необходимы для корневых типов, они не нужны для свойств в корневых свойствах.

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