如何从GSON解析中确定对象类?

时间:2017-05-06 20:30:40

标签: java object gson

我正在从字节数组中解析JSON字符串并将其作为对象进行转换。

如何确定对象的类?

Object objDeserialized = gson.fromJson(jsonFromString, Object.class);
//It could be type Message or RoomDetail

2 个答案:

答案 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,则必须将结果转换为原始包装器nullList<E>Map<K,V> - 并制作一些你自己分析一下。它背后的基本原理是你必须事先知道结果类,以确保你得到一个正确的反序列化对象。

你可以做的最好的事情就是让你的自定义父超类型(如果它是一个类或一个接口并不重要),比如class Message extends Baseclass 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);
}