2013-09-02 2 views
10

У меня есть класс с именем PageItem, который имеет конструктор, который принимает Context в качестве параметра:Gson десериализации вложенные объекты с InstanceCreator

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

PageItem имеет следующие свойства:

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

Newsprovider и Topic являются другие классы моей заявки и имеют следующие конструкторы:

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

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

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

с 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, используя конструктор без параметров без параметров. Как я могу это исправить?

ответ

11

Просто добавьте новый 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; 
     } 

} 

и зарегистрировать его в 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 класс.

Смежные вопросы