如何使用Gson </generictype> </object>将String List <object>解析为List <generictype>

时间:2013-09-10 04:23:41

标签: list double gson generic-type-argument

我想构建一个类,使用Gson将List<T>解析为String

private static class ListParser<T> {

    Gson gson = new Gson();

    public Type getGenericClass() {
        Type listType = new TypeToken<List<T>>() {
        }.getType();
        return listType;
    }

    public String toJson(List<T> list) {
        return gson.toJson(list, getGenericClass());
    }

    public List<T> fromJson(String json) {
        List<T> list1 = gson.fromJson(json, getGenericClass());
        List<T> list2 = new ArrayList<T>();
        for (int i = 0; i < list1.size(); i++) {
            T val = (T) list1.get(i);
            list2.add(val);
        }
        return list2;
    }
}

我使用TypeToken作为我发现的一些教程,但list1list2都是List<Double>。我想知道无论如何都要在Java中解析List<Double>List<T>

1 个答案:

答案 0 :(得分:0)

您的getGenericClass()无效,您需要检索T类。

您可以提供:

  Class<T> type;

  public Class<T> getType() {
    return this.type;
  }

或者在运行时获取它(不安全,我认为你可以在这个子喷气机上找到很多帖子)

  public Class<T> getType() {
    return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  }

然后,要构建列表令牌,您可以使用以下代码:

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

检查我在此处提供的示例:GSON deserialize an array of complex objects