2

複雑なオブジェクトの配列をデシリアライズしたい

たとえば、私はオブジェクトを持っていますMyTestObject

public class MyTestObject{

    String param1;
    String param2; 
    int param3;
}

今、私は名前付きのオブジェクトの配列を持っていますMyTestObject

私のjsonは次のようになります

{
[
"param1":"something1",
"param2:"something2",
"param3":3
],
[
"param1":"something1",
"param2:"something2",
"param3":3
],
[
"param1":"something1",
"param2:"something2",
"param3":3
]
}

これはデシリアライゼーションのための私のコードです

public static <T> List<T> fromJSON(String json, Class<T> className) {
    GsonBuilder builder = new GsonBuilder();
    builder.serializeNulls();
    Type myType = new TypeToken<List<T>>() {
    }.getType();
    Gson g1 = builder.create();
    List<T> objects = (List<T>) g1.fromJson(json, (Type) myType);
    for (T object : objects) {
        Log.d(TAG, "object: " + object + " class " + object.getClass());
    }
    return objects;
}

ArrayList<MyTestObject> objects = fromJSON(myjson,MyTestObject.class);

配列自体は正しく逆シリアル化されますが、その中のオブジェクトは正しいクラスではなく、型ですcom.google.gson.internal.LinkedTreeMap

タイプにする必要があるときMyTestObject

どうすればこれを修正できますか?

4

2 に答える 2

1

型消去のため、は使用できませんnew TypeToken<List<T>>()。GSon は の型を認識しませんThttps://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Generic-Types

T次のような静的な方法で提供できます

Type myType = new TypeToken<List<Something>>() {
}.getType();

または、ジェネリックTypeTokenのvar を使用してビルドします。Class<T>私の知る限り、これを行う簡単な方法はありません。これが私のやり方です:

 static TypeToken<?> getGenToken(final Class<?> raw, final Class<?> gen) throws Exception {
    Constructor<ParameterizedTypeImpl> constr = ParameterizedTypeImpl.class.getDeclaredConstructor(Class.class, Type[].class, Type.class);
    constr.setAccessible(true);
    ParameterizedTypeImpl paramType = constr.newInstance(raw, new Type[] { gen }, null);

    return TypeToken.get(paramType);
  }

次に、次のようにトークンを作成できます。

Class<T> tClass = ...;
Type myType = new getGenToken<List.class, tClass>()
于 2013-08-05T12:58:32.663 に答える