2017-09-08 5 views
1

J'ai cette classe:Deserialize générique de classe dans GSON dans Android

public class DbReturned<T> { 
    public boolean State; 
    public int UserID; 
    public String Error; 
    public T row; 
    public List<T> Data; 
    public boolean Hr; 
    public boolean Credits; 
} 

et classe de crédit:

public class Credits { 
    public int id; 
    public int year; 
    public int month; 
    public double t1; 
    public double t2; 
    public double t3; 
} 

et JSON est

result = {"State":true,"UserID":0,"Error":null,"Data":[{"id":1,"year":2017,"month":1,"t1":77,"t2":88,"t3":99,"CreateBy":1,"CreateDate":"2017-08-22T13:58:27.497","ModifyBy":1,"ModifyDate":"2017-08-22T13:58:27.497"}],"row":null,"Credits":false,"Hr":false} 

Comment désérialiser à DbReturned: ce code ne fonctionne pas:

Gson gson = new GsonBuilder().create(); 
      if(result != null) { 
       DbReturned<Credits> data = gson.fromJson(result, DbReturned.class); 
      } 

je: compiler 'com.google.code.gson: gson: 2.4' dans gradle

Répondre

1

J'ai trouvé la solution:

public <T> DbReturned<T> getResponse(final Class<T> dataClass , 
             final String rawResponse) 
    { 
     return gson.fromJson(rawResponse, 
          getType(DbReturned.class, 
          dataClass)); 
    } 



private Type getType(final Class<?> rawClass, 
         final Class<?> 
         parameterClass) 
    { 
     return new ParameterizedType() { 
      @Override 
      public Type[] getActualTypeArguments() { 
       return new Type[]{parameterClass}; 
      } 

      @Override 
      public Type getRawType() { 
       return rawClass; 
      } 

      @Override 
      public Type getOwnerType() { 
       return null; 
      } 

     }; 
    } 

et je l'ai appelé:

DbReturned<Credits> data = getResponse(Credits.class , 
             result.toString()); 

et la variable Gson est finale au sommet de la classe:

public final Gson gson = new Gson(); 
0

Il suffit d'utiliser

DbReturned<Credits> data = gson.fromJson(result, new DbReturned<Credits>(){}.getType()); 

de déclarer le type de données complète pour GSON.