【问题标题】:How to determine class of object from GSON parse?如何从 GSON 解析中确定对象的类别?
【发布时间】:2017-05-06 20:30:40
【问题描述】:

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

如何确定对象的类别?

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

【问题讨论】:

    标签: java object gson


    【解决方案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 Baseclass RoomDetail extends Base,然后注册一个JsonDeserializer<Base>实现到GsonBuilder 可以尝试检测 Base 实例的真实类型。之后你可以这样做:

    gson.fromJson(jsonSource, Base.class);
    

    查看更多:

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-31
        • 1970-01-01
        • 2013-10-14
        • 2010-10-07
        • 1970-01-01
        • 2015-10-03
        • 1970-01-01
        相关资源
        最近更新 更多