如何从GSON解析中确定对象类?
我正在从字节数组中解析JSON字符串并将其作为对象进行转换。
如何确定对象的类?
Object objDeserialized = gson.fromJson(jsonFromString, Object.class); //It could be type Message or RoomDetail
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
或Map
– 并自行进行某种分析。 它背后的基本原理是你必须事先知道结果类,以确保你得到一个正确的反序列化对象。
你可以在这里做的最好的事情是使你的自定义父类型超级(如果它是类或接口并不重要),比如class Message extends Base
class RoomDetail extends Base
和class RoomDetail extends Base
,然后注册JsonDeserializer
实现到一个GsonBuilder
,它可以尝试检测Base
实例的真实类型。 之后你可以这样做:
gson.fromJson(jsonSource, Base.class);
看更多:
- 多态对象反序列化:
- 如何使用注释在改进2中解析android中的动态json
- 如何使用自定义Gson反序列化解析嵌套的JSON对象数组?
- Json响应解析器的Array或Object
- Google Gson附加function,从未作为工件发布,但可能是您的灵感点:
如果您不知道要解析的JSON的类型,可以使用Gson lib中的JsonParser来直接解析JSON而不是Gson类。 例如
JsonParser parser = new JsonParser(jsonFromString); JsonObject obj = parser.parse().getAsJsonObject();
然后,您可以查看已创建的JsonObject的属性以查看它是什么。 例如
if (obj.has("somePropertyNameIKnownIsAMemberOfRoomDetail")) { RoomDetail roomDetail = gson.fromJson(jsonFromString, RoomDetail.class); } else { Message message = gson.fromJson(jsonFromString, Message.class); }