gson 如何在Android中检查类型

eqzww0vc  于 2022-11-23  发布在  Android
关注(0)|答案(5)|浏览(245)

我的一个函数得到了**Type**变量。有时它可能是java.util.List<Test$MyClass>java.util.List<java.lang.String>,那么我如何识别它们呢?

if (type instanceof List) {

}

两者都是列表类型,但类型不同。所以上面的代码不起作用。我想区分这两种列表类型。
我的主要问题是https://stackoverflow.com/questions/15596112/implement-jsondeserializer-more-than-one-in-gson-in-android
我使用deserializer来实现此目的。

public class Data implements JsonDeserializer<ArrayList<MyClass1>> {
public ArrayList<MyClass1> myList1 = new ArrayList<MyClass1>();
public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();

@Override
public ArrayList<MyClass1> deserialize(JsonElement json, Type type,
        JsonDeserializationContext context) throws JsonParseException {

    Debug.e("", type.toString());

    ArrayList<Layoutmap> data = new ArrayList<Layoutmap>();

    try {
        if (json.isJsonObject()) {

            // my stuff

            return data;
        } else {
            return new Gson().fromJson(json, type);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return data;
}

}
上面的代码适用于public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();myList2也是我想反序列化。它是谷歌Gson的一部分。

hgb9j2n6

hgb9j2n61#

是的,问题是在Java中,针对不可reiable类型的示例测试总是错误的。
例如:

if(o instance of List<E>)

其中E是任何型别,将不会编译。
您只需检查列表中包含的内容是否为同一类型,例如:

if(list1.get(0) instance of String && list2.get(0) instance of String)

编辑:

不确定这里是否存在语言障碍问题(你的问题很难完全理解),但是你不应该让你的方法接受Type类型的参数。正如其他人提到的,你的设计很糟糕。你应该做的是简单地定义如何反序列化你的每个类(如果定制的反序列化需要被定义 *;也就是说,如果默认值不起作用),然后使用Gson以常规方式获得这些值的列表。
我对Gson不是很熟悉,但应该是这样的:

List<Class1> stuff = gson.fromJson(json, new TypeToken<List<Class1>>(){}.getType());

因此,换句话说,如果每个类都有使默认反序列化不起作用的特性,那么就没有办法(没有大量的技巧)使deserialize方法对每一个类型都起作用。
另外,不要将所有的功能合并为一个,获取ArrayList<LayoutMap>应该与反序列化每个类的功能分开。

yrwegjxp

yrwegjxp2#

尝试在您的类型上使用getClass()函数来查找运行时对象的类。例如.. type.getClass().equals(java.lang.string)

e5nqia27

e5nqia273#

您可以尝试以下操作:

for (int i=0; i<type.size(); ++i) {
    if (type.get(i) instanceof String) {
        // Do something here
    }
}

这将检查列表的每个元素,如果它是一个字符串,你可以在它上面工作。

yftpprvb

yftpprvb4#

希望typeParameterizedType的一个示例,所以可以使用getActualTypeArguments()方法。

nnvyjq4y

nnvyjq4y5#

我只是找到了我的解决方案..我不知道这是不是更好
我正在比较两个Type变量,如下所示...

if (type.toString().equalsIgnoreCase(
                new TypeToken<List<Test.MyClass>>() {
                }.getType().toString())) {

}else
{

}

相关问题