2013-09-02 5 views
10

j'ai une classe nommée PageItem, qui a un constructeur qui prend un Context comme paramètre:Gson désérialisation objets imbriqués avec InstanceCreator

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

PageItem a ces propriétés:

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

Newsprovider et Topic sont autres classes de mon application et ont les constructeurs suivants:

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

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

PageItem, Newsprovider et Topic sont des sous-classes de SQLiteOpenHelper.

Je veux désérialiser tableau PageItem avec Gson, j'ai donc écrit:

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

avec PageItemInstanceCreator défini comme:

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

Lorsque le débogage, une instance PageItem a correctement "MainActivity" comme contexte tout en mais sa variable membre newsprovider a le contexte = null.

Gson a créé l'objet PageItem en utilisant le bon constructeur mais il a créé l'instance Newsprovider en utilisant le constructeur par défaut sans paramètre. Comment puis-je réparer cela?

Répondre

11

Il suffit d'ajouter une nouvelle InstanceCreator classe dérivée pour NewsProvider comme ceci:

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

} 

et l'enregistrer dans le GsonBuilder comme vous l'avez déjà fait, comme ceci:

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

répéter aussi pour Topic classe.

Questions connexes