2012-05-12 12 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); 

は、次のコードを見てみましょう は、のLinkedHashMapを返すdeserializedOBJ.object。 私はProtoAuthオブジェクトに戻って変換したいのですが...私はそれがProtoAuthであることをどのように知ることができますか? ProtoQueryで "action"パラメータを使用する。

私は

これを行うための最善の方法は何ですか? deserializedOBJ.params = gson.fromJSON(json.object、ProtoAuth.class)のようなものを必要としますか これを行うには、自分のシリアライザ/デシリアライザを書かずに別の方法がありますか?

実は私はそのコードを使用します。私は、次のようProtoQueryを入力し

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

私はあなたが "ProtoAuth"としてparamsを宣言することはできないと思いますか? –

+0

いいえ、paramsはProtoAuth、ProtoReq、ProtoStatus、ProtoEccになる可能性があるので、私はクラス内でクエリをラップしています。(外部の開発者はProtocol.javaと内部クラスを読んで、 – Kaiser69

答えて

6

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のPARAMをデシリアライズするために以下のように、あなたが呼び出すことができます。

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

非常に洗練された+1(パッド) – ant

+1

Mmm ...このケースでは、私の場合はTYPEをコンパイル時に知っていますので、私はそれを使わなければなりません:Type type = new TypeToken >(){} .getType(); - とにかく私はそのソリューションが簡単で、うまくいくと思います。ProtoAuthにも別のタイプ(UserInfoのようなオブジェクトで置き換えられたStringsユーザ/パス)が含まれていれば、もう少し問題はありませんか? – Kaiser69

+0

@ Kaiser69 GSonでJSon文字列を逆シリアル化することができます。唯一の制約は非直列化の間です:GSonは非直列化される型を知る必要があります。したがって、フィールドにUserInfoを入力すると問題は発生しません。スーパークラスまたはスーパーインターフェースでタイプされている場合、いくつかの問題があります。これらの問題は、TypeAdapterを使用することで解決できます。 –

関連する問題