2013-04-11 21 views
0

我正在使用Spring for Android從無法訪問對象中的任何函數的情況下向我的寧靜服務器和gson請求數據到Converter json到Java objetct。
由於有一個json屬性「user_id」,我想將這個保存爲轉換後的sqlite數據的主鍵。
問題是我的sqlite庫定義了一個「mId」屬性作爲抽象類中的主鍵。並且gson convert沒有使用「set function」來設置屬性。 我唯一想要的就是把user_id轉換爲mId。如何在抽象類中使用RestTemplate和Spring for Android時設置屬性

下面是代碼:
1.抽象類來訪問源碼:

public abstract class Model { 
    protected Long mId = null; 
    public final Long getId() { 
     return mId; 
    } 

    public void setId(Long id){ 
     mId = id; 
    } 

    public void saveToSqlite(){ 
     //using mId; 
    } 
} 

2.An類寧靜用戶數據:

public class User extends Model implements Serializable{ 
    private static final long serialVersionUID = 1L; 
    @SerializedName("user_id") 
    private Long userId; 

    public Long getUserId() { 
     return userId; 
    } 

    //this function is not accessed when user object generated 
    public void setUserId(Long userId) { 
     this.userId = userId; 
     this.setId(userId); 
    } 
} 

3.request並轉換代碼:

RestTemplate restTemplate = new RestTemplate(); 
GsonHttpMessageConverter jsonConverter = new GsonHttpMessageConverter(); 
restTemplate.getMessageConverters().add(jsonConverter); 
final String url = "http://restful.test.com/users"; 
User[] users = restTemplate.getForObject(url, User[].class); 

回答

0

聲明您的類的自定義反序列化器。像下面的那樣。

報價 - 模型

class Quote 
{ 
    private String symbol; 
    private String test; // the empty field we want to populate 

    // getters() setters() 
} 

QuoteCreator解串器 - 從符號填充測試

class QuoteCreator implements JsonDeserializer<Quote> 
{ 

    public Quote deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException 
    { 
     Gson g = new Gson(); 
     Quote a = g.fromJson(json, Quote.class); 
     a.setTest(a.getSymbol()); 
     return a; 
    } 
} 

運行

GsonBuilder b = new GsonBuilder(); 
b.registerTypeAdapter(Quote.class,new QuoteCreator()); 
Gson create = b.create(); 
Quote fromJson = (Quote) create.fromJson(file, Quote.class); 

它的工作原理。您可以使用更通用的反射解決方案來抓住各種類,但如果只是糾正了JSON,就更容易,而不是像這樣解決問題。

通用解串器

class MyCreator<T> implements JsonDeserializer<T> 
{ 

    public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
      throws JsonParseException 
    { 
     try 
     { 
      Gson g = new Gson(); 
      T a = g.fromJson(json, typeOfT); 
      Class<? extends Object> class1 = a.getClass(); 
      Method getter = class1.getMethod("getSymbol", null); 
      Method setter = class1.getMethod("setTest", String.class); 
      String symbol = (String) getter.invoke(a, null); 
      setter.invoke(a, symbol); 
      return a; 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      return null; 
     } 
    } 
} 

使用

b.registerTypeAdapter(Quote.class,new MyCreator<Quote>()); 
+0

謝謝迪帕克,我已經嘗試這樣做。 this.setId(userId); 設置mId。但gson轉換器不訪問setUserId函數!所以未能解決這個問題。 – 2013-04-11 07:06:53

+0

我假設你的意思是你會嘗試這樣做。讓我們知道它是如何擺脫的。謝謝。 – 2013-04-11 07:08:56

+0

我編輯我上面的評論。 – 2013-04-11 07:11:44