如何从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 ,则必须将结果转换为基本包装器, nullListMap – 并自行进行某种分析。 它背后的基本原理是你必须事先知道结果类,以确保你得到一个正确的反序列化对象。

你可以在这里做的最好的事情是使你的自定义父类型超级(如果它是类或接口并不重要),比如class Message extends Base class RoomDetail extends Baseclass RoomDetail extends Base ,然后注册JsonDeserializer实现到一个GsonBuilder ,它可以尝试检测Base实例的真实类型。 之后你可以这样做:

 gson.fromJson(jsonSource, Base.class); 

看更多:

如果您不知道要解析的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); }