google gson LinkedTreeMap类转换为myclass

我知道这个问题之前已经被问过了。 由于我在javaandroid的新手技巧。 我无法解决这个问题超过一个星期。

我的一个朋友和我开发一个android项目是有这样的一些事情。

这件事情中最奇怪的部分是,只有当我从Google Play商店下载并testing它时才会发生。 不是从本地的android studio安装或debugging模式。

这里有什么问题,或者这个返回列表是完全错误的? 我的朋友说服这个代码正确地返回,但从游戏商店安装它总是一个错误。

请build议我在哪里挖掘?

@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(Unknown Source)上的com.gaurage.dto.DoServiceDto

Solutions Collecting From Web of "google gson LinkedTreeMap类转换为myclass"

序列化和反序列化generics

当你调用toJson(obj)时,Gson调用obj.getClass()来获取要序列化的字段的信息。 同样的,你通常可以在fromJson(json,MyClass.class)方法中传递MyClass.class对象。 如果对象是非genericstypes,这工作正常。 但是,如果对象是genericstypes,那么genericstypes信息由于Javatypes擦除而丢失。 这里是一个例子说明这一点:

 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 

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

您可以通过为genericstypes指定正确的参数化types来解决此问题。 你可以通过使用TypeToken类来做到这一点。

 Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); gson.toJson(foo, fooType); gson.fromJson(json, fooType); 

我有父类和它的子类,其中一些列表types在其中。 像这个父类我有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); 

最重要的是,我不能在Android Studio的本地testing中重现这个错误。 这个问题只会popup,当我生成签名apk和发布应用程序到PlayStore的应用程序停止,并报告说不能将LinkedTreeMap投射到myclass。

在我的本地testing中(包括debugging模式)很难重现相同的结果。