3

我的函数之一是获取类型变量。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我也想反序列化..它是 google Gson的一部分。

4

5 回答 5

3

是的,问题在于,在 Java 中,针对不可具体化的类型的实例测试始终是错误的。

例如:

if(o instance of List<E>)

其中 E 是任何类型,不会编译。

您只需检查列表中包含的内容是否相同,例如

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

编辑:

不确定这里是否存在语言障碍问题(您的问题很难完全理解),但您不需要让您的方法采用 Type 类型的参数。正如其他人提到的,你这里的设计很糟糕。您应该做的只是定义如何反序列化您的每个类(如果需要定义自定义反序列化......也就是说,如果默认值不起作用),然后以常规方式获取这些类的列表格森。

我对 GSON 不是很熟悉,但应该是这样的:

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

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

于 2013-03-24T11:57:35.467 回答
1

您可以尝试以下方法:

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

这将检查列表的每个元素,如果它是一个字符串,你可以处理它。

于 2013-03-24T12:00:51.700 回答
1

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

于 2013-03-24T12:04:40.230 回答
0

希望type将成为ParameterizedType. 因此,您可以使用getActualTypeArguments()方法。

于 2013-03-24T12:14:34.923 回答
0

我只是找到了我的解决方案..我不知道它是否更好

我正在比较两个Type这样的变量......

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

}else
{

}
于 2013-03-24T12:21:10.617 回答