当前位置: 首页 > 知识库问答 >
问题:

google gson LinkedTreeMap类转换为myclass

尹俊雅
2023-03-14

最奇怪的是,只有当我从Google play商店下载并测试它时,它才会发生。不是从本地android studio安装或调试模式。

这里的问题是什么,或者这个返回列表是完全错误的?我的朋友确信,这段代码返回正确,但从play store安装,它总是一个错误。

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

@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(来源未知)

共有1个答案

陆博易
2023-03-14

泛型类型的序列化和反序列化

当您调用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);

我有父类,它是子类,其中一些有列表类型。像这个父类一样,我有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。

 类似资料:
  • 最奇怪的是,只有当我从Google play商店下载并测试它时,它才会发生。不是从本地android studio安装或调试模式。 这里的问题是什么,或者这个返回列表是完全错误的?我的朋友确信,这段代码返回正确,但从play store安装,它总是一个错误。 请建议我在哪里继续挖掘? 例外是 java.lang.ClassCastException:com.google.gson.internal

  • 问题内容: 我想创建一个包含我的类的实例变量的JSON字符串。 例如, 会成为: 我研究了几个用于创建JSON的C ++库,它们似乎都异常复杂。我想要类似Javascript的东西。换句话说,只需将std :: map传递给它并接收一个字符串。该地图可能包含其他地图,向量,列表,字符串,数字和布尔值。 最好的方法是什么? 谢谢你的帮助。 编辑 我研究了以下内容: json spirit,jsonc

  • 我理解超类/子类之间的关系以及强制转换是如何工作的。但是,我的问题是,如果知道中间有一个类,你能把一个超类转换成一个特定的子类吗?例如,如果我有一个动物类对象包含一个BigDog对象,我可以将该对象强制转换为Dog吗?如果BigDog中有Dog中不存在的方法怎么办? 简而言之,你当然可以说超类对象是子类对象,但为什么你可以反转呢? 转念一想, Java在调用方法时检查的是:引用(DOG)是否有引用

  • 问题内容: 我有一个对象,或一个对象。如何在java.time框架中将其转换为正确的类型? 我听说我们现在应该使用类型来做大部分业务逻辑。当使用尚未为java.time更新的旧代码时,我需要能够来回转换。什么类型映射到或? 问题答案: 避免使用旧的日期时间类 老式的日期时间类(包括,和)已被证明设计不良,混乱且麻烦。尽可能避免它们。但是,当你必须与这些旧类型进行互操作时,可以在新旧之间进行转换。

  • 问题内容: 我想转换成类型。因为我想将日期设置为。还是有任何支持日期的日期选择器? 问题答案: 假设你的日期选择器使用系统默认时区将日期转换为字符串。

  • 问题内容: 我有从熊猫生成的以下形式的字典列表。我想将其转换为json格式。 但是,json.dumps会引发错误:TypeError:685不可序列化JSON 我猜这是从numpy到python(?)的类型转换问题。 但是,当我使用np.int32(v)转换数组中每个字典的值v时,仍会引发错误。 编辑:这是完整的代码 问题答案: 看来您是正确的: 这里的可惜的是,numpy的数字不给你什么任何暗