2011-01-03 5 views
1

Я пытаюсь использовать Gson для инициализации моих полей, но не удался.Инициализация полей класса из JSON с использованием 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 быть заполнены.

ответ

3

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

Вот how to deal with this problem in GSON:

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

Но это не поможет, так как вы хотите, чтобы родительский объект, а не только список. Боюсь, вам нужно будет write your own Custom Serialization and Deserialization methods

+0

Я думаю, что для меня важными являются данные этих задач, поэтому должно быть хорошо, спасибо за информацию. – Eugene

+0

@AndroidNoob спасибо приятно, upvotes лучше –

+0

Хотя у меня есть исключение: Caused by: java.lang.IllegalStateException: это не массив JSON. – Eugene

0

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

Тип-стирание, упомянутое другим ответом, должно Не проблема: свойство «task» объявлено как List, и этого достаточно, чтобы Gson определял общий тип. Да, декларации полей сохраняют общую информацию типа типа, стирание типа имеет больше общего с информацией о времени выполнения, доступной через класс . Так что, пока объекты ссылки типа необходимы для root ty pes, они не нужны для свойств под свойствами root.