【发布时间】:2017-05-06 20:30:40
【问题描述】:
我正在从字节数组中解析 JSON 字符串并将其转换为对象。
如何确定对象的类别?
Object objDeserialized = gson.fromJson(jsonFromString, Object.class);
//It could be type Message or RoomDetail
【问题讨论】:
我正在从字节数组中解析 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<E> 或Map<K,V>——并自己进行某种分析。其背后的基本原理是您必须提前知道结果类,以确保获得正确的反序列化对象。
你可以在这里做的最好的事情是让你的自定义父超类型(不管它是一个类还是一个接口),比如class Message extends Base和class RoomDetail extends Base,然后注册一个JsonDeserializer<Base>实现到GsonBuilder 可以尝试检测 Base 实例的真实类型。之后你可以这样做:
gson.fromJson(jsonSource, Base.class);
查看更多:
【讨论】:
如果您不知道要解析的 JSON 的类型,您可以使用 Gson 库中的 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);
}
【讨论】: