2012-05-12 56 views
1

我在GSON-JSON中遇到了一些問題。GSON-JSON反序列化類中的對象

我們看到下面的代碼:

public static class ProtoQuery { 
    public String action; 
    public String token; 
    public Object params; 

    public ProtoQuery(String action, String token, Object params) { 
     this.action = action; 
     this.token = token; 
     this.params = params; 
    } 
} 


// Authentication Phase 
public static class ProtoAuth { 
    public String username; 
    public String password; 

    public ProtoAuth(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 
} 


    // Serialize Object 
    Gson gson = new Gson(); 
    ProtoQuery tmp = new ProtoQuery("ProtoAuth", "", new JirckeProtocol.ProtoAuth("ABC", "myPASS")); 
    String json = gson.toJson(tmp); 

    // Deserialize Object 
    ProtoQuery deserializedOBJ = gson.fromJson(json, ProtoQuery.class); 

問題就在這裏: deserializedOBJ.object返回LinkedHashMap中。 我想轉換回ProtoAuth對象..我怎麼知道這是一個ProtoAuth?在ProtoQuery中使用「action」參數。

我需要這樣的東西 deserializedOBJ.params = gson.fromJSON(json.object,ProtoAuth.class)

什麼是做到這一點的最好方法是什麼? 還有一種方法可以做到這一點,無需編寫我自己的序列化器/ deserialer?

其實我使用該代碼:

deserializedOBJ.params = gson.fromJson(element, Class.forName("MyProtocol$ProtoAuth")); 
+0

我想你不能將params聲明爲「ProtoAuth」? –

+0

不,因爲參數可以是ProtoAuth,ProtoReq,ProtoStatus,ProtoEcc ...我將我的查詢包裝在類中,我認爲它對於更好的文檔是有用的(外部開發人員可以讀取Protocol.java和內部類並知道什麼請求和每個查詢的參數) – Kaiser69

回答

6

我會鍵入ProtoQuery如下:

public static class ProtoQuery<T> { 
    public String action; 
    public String token; 
    public T params; 

    public ProtoQuery(String action, String token, T params) { 
     this.action = action; 
     this.token = token; 
     this.params = params; 
    } 
} 


// Authentication Phase 
public static class ProtoAuth { 
    public String username; 
    public String password; 

    public ProtoAuth(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 
} 

與類型ProtoAuth的參數去反序列化,您可以撥打如下:

Type type = new TypeToken<ProtoQuery<ProtoAuth>>() {}.getType(); 
ProtoQuery<ProtoAuth> deserializedOBJ = gson.fromJson(json, type); 
+0

非常優雅的+1(墊) – ant

+1

嗯...在這種情況下,你知道在編譯時的TYPE,在我的情況下我不知道,所以我必須使用它:Type type = new TypeToken >(){} .getType(); - 無論如何,我認爲這個解決方案很簡單,並且工作得很好。另一個小問題,如果ProtoAuth也包含另一個類型(字符串用戶/通過用UserInfo對象替代),我可以反序列化沒有問題嗎? – Kaiser69

+0

@ Kaiser69您可以用GSon來完成您想要反序列化JSon字符串的任何事情。唯一的限制是在反序列化過程中:GSon必須知道將被反序列化的類型。因此,如果您的字段使用UserInfo鍵入,則不會有問題。如果輸入超類或超界面,那麼你會遇到一些問題。這些問題可以通過使用TypeAdapter來解決。 –