2013-09-02 14 views
10

Ich habe eine Klasse PageItem genannt, die einen Konstruktor hat, der einen Context als Parameter übernimmt:Gson Deserialisieren verschachtelte Objekte mit InstanceCreator

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

PageItem hat folgende Eigenschaften:

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

Newsprovider und Topic sind andere Klassen meiner Anwendung und haben die folgenden Konstruktoren:

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

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

PageItem, Newsprovider und Topic sind Unterklassen von SQLiteOpenHelper.

Ich möchte PageItem Array mit Gson deserialisieren, so schrieb ich:

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

mit PageItemInstanceCreator wie folgt definiert:

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

Wenn Debugging, eine PageItem Instanz richtig "MainActivity" als Kontext hat, während aber seine newsprovider Mitgliedsvariable hat context = null.

Gson erstellt PageItem Objekt mit dem richtigen Konstruktor, aber es erstellt Newsprovider Instanz mit dem standardmäßigen parameterlosen Konstruktor. Wie kann ich das beheben?

Antwort

11

Fügen Sie einfach einen neuen InstanceCreator abgeleiteten Klasse für NewsProvider wie folgt aus:

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

} 

und registrieren Sie es in die GsonBuilder wie Sie bereits getan haben, wie folgt aus:

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

wiederholen es auch für Topic Klasse.

Verwandte Themen