Gson使用InstanceCreator反序列化嵌套对象

use*_*379 13 java android gson

我有一个名为的类PageItem,它有一个带有Contextas参数的构造函数:

PageItem(Context context)
{
    super(context);
    this.context = context;
}
Run Code Online (Sandbox Code Playgroud)

PageItem 有这些属性:

private int id; 
private String Title; 
private String Description; 
public Newsprovider newsprovider; 
public Topic topic;
Run Code Online (Sandbox Code Playgroud)

Newsprovider并且Topic是我的应用程序的其他类,并具有以下构造函数:

Newsprovider (Context context)
{
    super(context);
    this.context = context;
}

Topic (Context context)
{
    super(context);
    this.context = context;
}
Run Code Online (Sandbox Code Playgroud)

PageItem,Newsprovider并且Topic是的子类SQLiteOpenHelper.

我想PageItem用Gson 反序列化数组,所以我写道:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context));
Gson gson = gsonBuilder.create();
Pageitem pis[] = gson.fromJson(s, PageItem[].class);
Run Code Online (Sandbox Code Playgroud)

以PageItemInstanceCreator定义为:

public class PageItemInstanceCreator implements InstanceCreator<PageItem>
    {
        private Context context;

        public PageItemInstanceCreator(Context context)
        {
            this.context = context;
        }

        @Override
        public PageItem createInstance(Type type)
        {
            PageItem pi = new PageItem(context);
            return pi; 
        }
}
Run Code Online (Sandbox Code Playgroud)

在调试时,PageItem实例具有正确的"MainActivity"作为上下文,但其newsprovider成员变量具有context = null.

Gson PageItem使用正确的构造函数创建了对象,但它Newsprovider使用默认的无参数构造函数创建了实例.我怎样才能解决这个问题?

gia*_*olo 13

只需添加一个新的InstanceCreator派生类,NewsProvider如下所示:

public class NewsProviderInstanceCreator implements InstanceCreator<NewsProvider>
    {
        private int context;

        public NewsProviderInstanceCreator(int context)
        {
            this.context = context;
        }

        @Override
        public NewsProvider createInstance(Type type)
        {
            NewsProvider np = new NewsProvider(context);
            return np; 
        }

}
Run Code Online (Sandbox Code Playgroud)

并将其注册到GsonBuilder您已经完成的任务中,如下所示:

GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(PageItem.class, new PageItemInstanceCreator(context));
gsonBuilder.registerTypeAdapter(NewsProvider.class, new NewsProviderInstanceCreator(context));
Gson gson = gsonBuilder.create();
PageItem pis[] = gson.fromJson(s, PageItem[].class);
Run Code Online (Sandbox Code Playgroud)

Topic上课也重复一遍.