google gson LinkedTreeMap类转换为myclass

我知道以前曾问过这个问题。由于我的Java和android新手技能。我不能解决这个问题超过一个星期。

我和我的一个朋友开发了一个android项目,那里有几件事。

这件事中最奇怪的部分是,它仅在我从Google Play商店下载并对其进行测试时才发生。不是从本地android studio安装或调试模式。

这可能是什么问题,或者此返回列表完全错误?我的朋友说服此代码可以正确返回,但是从Play商店安装开始,这始终是错误。

请建议我应该在哪里继续挖掘?

@Override

public void promiseMethod(JSONObject object) {

if (object != null) {

if (object.has(DO_SERVICES)) {

vehicleDetails = new ArrayList < Object[] > (1);

List < String > vehicleNoList = new ArrayList < String > (1);

List < String > serviceList = new ArrayList < String > (1);

try {

Gson gson = new Gson();

JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES)

.toString());

servDto = gson.fromJson(jsonObj.toString(),

ServiceDto.class);

if (servDto.getServiceDto() instanceof List) {

List < DoServiceDto > doServiceList = servDto.getServiceDto();

例外是

java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap无法通过com.gaurage.user.User_Test_Main.promiseMethod(未知来源)转换为com.gaurage.dto.DoServiceDto

回答:

序列化和反序列化通用类型

当您调用toJson(obj)时,Gson会调用obj.getClass()以获取有关要序列化的字段的信息。同样,通常可以在fromJson(json,MyClass.class)方法中传递MyClass.class对象。如果对象是非泛型类型,则可以正常工作。但是,如果对象属于通用类型,则由于Java

Type Erasure,通用类型信息会丢失。这是说明要点的示例:

class Foo<T> {  T value;}

Gson gson = new Gson();

Foo<Bar> foo = new Foo<Bar>();

gson.toJson(foo); // May not serialize foo.value correctly

gson.fromJson(json, foo.getClass()); // Fails to deserialize foo.value as Bar

上面的代码无法将值解释为Bar类型,因为Gson调用list.getClass()来获取其类信息,但是此方法返回的是原始类Foo.class。这意味着Gson无法知道这是Foo类型的对象,而不仅仅是纯Foo。

您可以通过为泛型类型指定正确的参数化类型来解决此问题。您可以通过使用TypeToken类来实现。

Type fooType = new TypeToken<Foo<Bar>>() {}.getType();    

gson.toJson(foo, fooType);

gson.fromJson(json, fooType);

我有Parent类,而它是child类,其中一些具有List类型。像这个父类一样,我有30个文件。我这样解决了。

Gson gson = new Gson();

JSONObject jsonObj = new JSONObject(object.get(DO_SERVICES).toString());

Type type = new TypeToken<MyDto>() {}.getType();

servDto = gson.fromJson(jsonObj.toString(),type);

我很难在本地测试(包括“调试”模式)中重现相同的结果。

以上是 google gson LinkedTreeMap类转换为myclass 的全部内容, 来源链接: utcz.com/qa/417007.html

回到顶部