2013-09-02 13 views
10

ho una classe denominata PageItem, che ha un costruttore che prende un Context come parametro:GSON deserializzazione oggetti nidificati con InstanceCreator

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

PageItem ha queste proprietà:

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

Newsprovider e Topic sono altre classi della mia domanda e hanno i seguenti costruttori:

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

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

PageItem, Newsprovider e Topic sono sottoclassi di SQLiteOpenHelper.

voglio deserializzare PageItem array con GSON, così mi ha scritto:

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

con PageItemInstanceCreator definito come:

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

Quando il debug, un'istanza PageItem ha correttamente "MainActivity" come contesto, mentre ma la sua variabile membro newsprovider ha context = null.

Gson ha creato l'oggetto PageItem utilizzando il costruttore corretto ma ha creato l'istanza Newsprovider utilizzando il costruttore senza parametri predefinito. Come posso risolvere questo?

risposta

11

Basta aggiungere un nuovo InstanceCreator classe derivata per NewsProvider come questo:

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

} 

e registrarlo nella GsonBuilder come avete già fatto, in questo modo:

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

ripeterlo anche per Topic classe.

Problemi correlati