我正在从字节数组中解析JSON字符串并将其作为对象进行转换。
如何确定对象的类?
Object objDeserialized = gson.fromJson(jsonFromString, Object.class);
//It could be type Message or RoomDetail
答案 0 :(得分:1)
gson.fromJson(jsonFromString,Object.class);
通常,由于Object.class
,这不起作用。 Gson禁止覆盖Object
类反序列化并使用ObjectTypeAdapter
(请参阅Gson 2.8.0中的主要Gson
构造函数,可能更早):
// built-in type adapters that cannot be overridden
factories.add(TypeAdapters.JSON_ELEMENT_FACTORY);
factories.add(ObjectTypeAdapter.FACTORY);
// the excluder must precede all adapters that handle user-defined types
factories.add(excluder);
// user's type adapters
factories.addAll(typeAdapterFactories);
如果您想使用Object.class
,则必须将结果转换为原始包装器null
或List<E>
或Map<K,V>
- 并制作一些你自己分析一下。它背后的基本原理是你必须事先知道结果类,以确保你得到一个正确的反序列化对象。
你可以做的最好的事情就是让你的自定义父超类型(如果它是一个类或一个接口并不重要),比如class Message extends Base
和class RoomDetail extends Base
,然后注册一个{ {1}} JsonDeserializer<Base>
的实现,可以尝试检测 GsonBuilder
实例的实际类型。之后你可以这样做:
Base
查看更多:
答案 1 :(得分:0)
如果您不知道要解析的JSON的类型,可以使用Gson lib中的JsonParser直接解析JSON而不是Gson类。 e.g。
JsonParser parser = new JsonParser(jsonFromString);
JsonObject obj = parser.parse().getAsJsonObject();
然后,您可以查看已创建的JsonObject的属性以查看它是什么。 e.g。
if (obj.has("somePropertyNameIKnownIsAMemberOfRoomDetail")) {
RoomDetail roomDetail = gson.fromJson(jsonFromString, RoomDetail.class);
} else {
Message message = gson.fromJson(jsonFromString, Message.class);
}