1

我正在尝试使用 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

4

2 回答 2

3

问题是通用类型擦除。GSON 不知道要创建什么样的对象,因为您的类仅包含一个列表(有关的类型信息Task丢失)。

以下是在 GSON 中处理此问题的方法

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

但这对您没有帮助,因为您需要父对象,而不仅仅是列表。恐怕您将不得不编写自己的自定义序列化和反序列化方法

于 2011-01-03T15:35:06.547 回答
0

您的 JSON 未映射到您定义的类:它缺少几个级别(具有“菜单”属性的主级别对象,然后是实际包含 TaskHolder 的菜单对象。所以您应该定义 JSON 映射到的类结构(否则Gson 会知道将什么映射到哪里吗?),或者预处理 JSON 以删除您不需要的东西。

另一个答案提到的类型擦除不应该​​是这里的问题:您的“任务”属性被声明为列表,这应该足以让 Gson 确定泛型类型。是的,字段声明确实保留了泛型类型信息;类型擦除更多地与通过 Class 提供的运行时信息有关。因此,虽然根类型需要类型引用对象,但根属性下的属性不需要它们。

于 2011-01-04T18:37:43.683 回答