【问题标题】:Gson deserializing nested objects with InstanceCreatorGson 使用 InstanceCreator 反序列化嵌套对象
【发布时间】:2013-09-05 05:42:55
【问题描述】:

我有一个名为PageItem 的类,它有一个以Context 作为参数的构造函数:

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

PageItem 具有以下属性:

private int id; 
private String Title; 
private String Description; 
public Newsprovider newsprovider; 
public Topic topic;

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

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

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

PageItemNewsproviderTopicSQLiteOpenHelper 的子类。

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

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

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; 
        }
}

调试时,PageItem 实例具有正确的“MainActivity”作为上下文,而 但它的newsprovider 成员变量的context = null。

Gson 使用正确的构造函数创建了 PageItem 对象,但它使用默认的无参数构造函数创建了 Newsprovider 实例。我该如何解决这个问题?

【问题讨论】:

    标签: java android gson


    【解决方案1】:

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

    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; 
            }
    
    }
    

    并像您已经完成的那样将其注册到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);
    

    Topic 类也重复一遍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多