Gson反序列化给定对象类的对象数组

14 浏览
0 Comments

Gson反序列化给定对象类的对象数组

在GSON中,要获取对象列表,可以这样做:

Gson gson = new Gson();
Type token = new TypeToken>(){}.getType();
return gson.fromJson(json, token);

这个方法很好用,但我想进一步,使MyType参数化,这样我就可以有一个通用的函数来使用这段代码解析对象列表:

// 通用函数
public  List fromJSonList(String json, Class type) {
  Gson gson = new Gson();
  Type collectionType = new TypeToken>(){}.getType();
  return gson.fromJson(json, collectionType);
}
// 调用
List myTypes = parser.fromJSonList(jsonString, MyType.class);

遗憾的是,返回的是一个StringMap的数组,而不是我的类型。T被解释为另一个泛型类型,而不是我的类型。有什么解决办法吗?

0
0 Comments

自从gson 2.8.0版本以后,可以使用TypeToken类的getParametized方法来创建typeToken对象,然后通过getType方法获取到所需的类型。例如,可以通过以下代码获取到List的类型:

TypeToken.getParameterized(List.class, myType.class).getType();

在此之前,如果想要反序列化一个包含对象数组的json字符串,需要特别处理。根据gson的文档,可以使用TypeToken类来处理这个问题。通过TypeToken的构造函数,可以创建一个包含了泛型信息的Type对象,然后将这个Type对象传递给fromJson方法,即可正确地反序列化对象数组。

然而,在之前的版本中,创建Type对象时需要使用匿名内部类,这样的写法比较繁琐。为了简化这个过程,gson 2.8.0版本引入了getParametized方法,可以更方便地创建Type对象。该方法接受一个原始类型和一组泛型参数类型,返回一个包含了泛型信息的Type对象。

因此,如果想要反序列化一个对象数组,只需使用getParametized方法创建TypeToken对象,然后通过getType方法获取到所需的Type对象,即可正确地反序列化。

以上就是问题的出现原因以及解决方法。通过使用gson 2.8.0版本引入的getParametized方法,可以更方便地处理反序列化数组对象的问题。

0
0 Comments

问题的出现是因为在使用Gson反序列化数组对象时,由于类型擦除的原因,无法获取到泛型参数的具体类型。解决方法是通过实现ParameterizedType接口来传递具体的泛型类型。

在Java中,泛型是在编译时生效的,编译后的字节码中不会包含泛型信息。因此,Gson在反序列化时无法读取到泛型信息,导致无法正确地反序列化数组对象。

为了解决这个问题,可以通过实现ParameterizedType接口来传递具体的泛型类型。具体实现方法如下:

class ListOfSomething implements ParameterizedType {
    private Class wrapped;
    public ListOfSomething(Class wrapped) {
        this.wrapped = wrapped;
    }
    public Type[] getActualTypeArguments() {
        return new Type[] {wrapped};
    }
    public Type getRawType() {
        return List.class;
    }
    public Type getOwnerType() {
        return null;
    }
}

然后,在`fromJsonList()`方法中使用这个实现类来反序列化数组对象:

public List fromJsonList(String json, Class klass) {
    Gson gson = new Gson();
    return gson.fromJson(json, new ListOfSomething(klass));
}

这样,就可以通过`getFromJsonList()`方法来反序列化数组对象了。使用这种方法可以避免使用`TypeToken`,使代码更加简洁、可读性更高。

需要注意的是,这种方法只适用于已知泛型类型的情况。如果需要在另一个泛型类中使用`List`,可以参考这个答案中的代码,并根据具体情况进行调整。

通过实现ParameterizedType接口来传递具体的泛型类型,可以解决Gson反序列化数组对象时无法获取到泛型参数具体类型的问题。这种方法可以使代码更加简洁、可读性更高。

0
0 Comments

问题:Gson如何将一个对象数组反序列化为给定的对象类?

原因:该问题的出现是因为在使用Gson进行反序列化时,有时候我们希望将一个对象数组反序列化为给定的对象类,但是直接使用Gson.fromJson方法只能将其反序列化为Object[],无法直接得到指定类的对象数组。

解决方法:我们可以通过编写一个通用的方法来解决这个问题。首先,我们需要传入一个Class对象和一个JSON字符串。然后,我们使用Gson的fromJson方法将JSON字符串反序列化为一个指定类的数组对象。接下来,我们使用Arrays.asList方法将数组转换为List对象,并将其作为结果返回。

下面是解决方法的代码示例:

public static final  List getList(final Class clazz, final String json) {
    final T[] jsonToObject = new Gson().fromJson(json, clazz);
    return Arrays.asList(jsonToObject);
}

使用示例:

getList(MyClass[].class, "[{...}]");

注意事项:虽然这个解决方法非常实用,但是需要注意,Arrays.asList返回的List对象是一个只读的数组包装器,无法对其进行添加或修改操作。如果需要对List进行修改,可以将其转换为ArrayList或使用其他可变的List实现类。

0