GSON反序列化复杂对象的数组 [英] GSON deserialize an array of complex objects

查看:414
本文介绍了GSON反序列化复杂对象的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要反序列化的复杂对象的数组

I want to deserialize an array of complex objects

比如我有对象 MyTestObject

public class MyTestObject{

    String param1;
    String param2; 
    int param3;
}

现在我有一个名为对象的数组 MyTestObject

now i have an array of objects named MyTestObject

和我的JSON看起来像这样

and my json looks like this

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

这是我的code为desearilization

this is my code for desearilization

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

我要如何解决这个问题?

how do i fix this?

推荐答案

一个例子:

public class Test<T> {
  public static void main(String[] args) throws Exception {
    new Test<String>().test(String.class);
    new Test<Integer>().test(Integer.class);
    new Test<Long>().test(Long.class);
  }

  public void test(Class<T> cls) throws Exception {
    TypeToken<?> typeOfT = getGenToken(List.class, cls);
    List<?> lst = (List<?>) new Gson().fromJson("[1, 2, 3]", typeOfT.getType());

    for (Object o : lst) {
      System.out.println("value : " + o + ", type : " + o.getClass());
    }
  }

  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);
  }
}

ParameterizedTypeImpl 来自 sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl

输出:

value : 1, type : class java.lang.String
value : 2, type : class java.lang.String
value : 3, type : class java.lang.String
value : 1, type : class java.lang.Integer
value : 2, type : class java.lang.Integer
value : 3, type : class java.lang.Integer
value : 1, type : class java.lang.Long
value : 2, type : class java.lang.Long
value : 3, type : class java.lang.Long

注:事实上,我们可以用 T 更换wildcar,但是我们在这里不会有用

Note : in fact we could replace the wildcar with T, but that's not usefull here.

这篇关于GSON反序列化复杂对象的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆