我的一个函数得到了**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的一部分。
5条答案
按热度按时间hgb9j2n61#
是的,问题是在Java中,针对不可reiable类型的示例测试总是错误的。
例如:
其中E是任何型别,将不会编译。
您只需检查列表中包含的内容是否为同一类型,例如:
编辑:
不确定这里是否存在语言障碍问题(你的问题很难完全理解),但是你不应该让你的方法接受Type类型的参数。正如其他人提到的,你的设计很糟糕。你应该做的是简单地定义如何反序列化你的每个类(如果定制的反序列化需要被定义 *;也就是说,如果默认值不起作用),然后使用Gson以常规方式获得这些值的列表。
我对Gson不是很熟悉,但应该是这样的:
因此,换句话说,如果每个类都有使默认反序列化不起作用的特性,那么就没有办法(没有大量的技巧)使
deserialize
方法对每一个类型都起作用。另外,不要将所有的功能合并为一个,获取
ArrayList<LayoutMap>
应该与反序列化每个类的功能分开。yrwegjxp2#
尝试在您的类型上使用getClass()函数来查找运行时对象的类。例如.. type.getClass().equals(java.lang.string)
e5nqia273#
您可以尝试以下操作:
这将检查列表的每个元素,如果它是一个字符串,你可以在它上面工作。
yftpprvb4#
希望
type
是ParameterizedType
的一个示例,所以可以使用getActualTypeArguments()方法。nnvyjq4y5#
我只是找到了我的解决方案..我不知道这是不是更好
我正在比较两个
Type
变量,如下所示...