gpt4 book ai didi

java - 谷歌 gson LinkedTreeMap 类转换为 myclass

转载 作者:IT老高 更新时间:2023-10-28 20:42:45 35 4
gpt4 key购买 nike

我知道以前有人问过这个问题。由于我在java和android方面的新手技能。我无法解决这个问题超过一个星期。

我和我的一个 friend 正在开发一个 android 项目,如果有一些这样的事情。

这件事最奇怪的部分是,它只发生在我从 Google Play 商店下载并测试它时。不是来自本地 android studio 安装或 Debug模式。

这可能是什么问题,或者这个返回列表是完全错误的?我的 friend 说服此代码正确返回,但从 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();

异常(exception)是

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.gaurage.dto.DoServiceDto at com.gaurage.user.User_Test_Main.promiseMethod(Unknown Source)

最佳答案

对泛型类型进行序列化和反序列化

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

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

上面的代码无法将 value 解释为类型 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 类,它是子类,其中一些包含 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);

最重要的是,我无法在 Android Studio 的本地测试中重现此错误。仅弹出此问题,当我生成已签名的 apk 并将应用程序发布到 PlayStore 时,应用程序停止了,并且报告显示无法将 LinkedTreeMap 转换为 myclass。

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

关于java - 谷歌 gson LinkedTreeMap 类转换为 myclass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32444863/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com