【问题标题】:Deserialize message from JSON to POJO using Jackson使用 Jackson 将消息从 JSON 反序列化到 POJO
【发布时间】:2012-03-21 21:55:26
【问题描述】:

如果您在不检查消息的情况下不确切知道要使用哪种类型的 POJO,您将如何使用 Jackson 将 JSON 文档反序列化为 POJO。有没有办法向 Jackson 注册一组 POJO,以便它可以根据消息选择一个?

我试图解决的场景是通过网络接收 JSON 消息,并根据消息的内容反序列化为多个 POJO 之一。

【问题讨论】:

    标签: java jackson pojo


    【解决方案1】:

    我不知道您所描述的机制。 我认为您必须自己检查 json:

        Map<String, Class<?>> myTypes = ... 
        String json = ...
        JsonNode node = mapper.readTree(json);
        String type = node.get("type").getTextValue();
        Object myobject = mapper.readValue(json, myTypes.get(type));
    

    如果您没有类型字段,则必须检查 JsonNode 中的字段才能解析类型。

    【讨论】:

    • 另外一个建议:您也可以通过“Object myObject = mapper.treeAsValue(node, type);”直接从树 (JsonNode) 转换为 POJO。这不仅效率更高,而且还允许您根据需要修改树(添加或删除节点、更改值)。
    【解决方案2】:

    如果您的 JSON 库具有灵活性,请查看 Jackson。它有一个BeanDeserializer 可用于此目的。

    【讨论】:

    • 在给定消息内容的情况下,如何使用该类反序列化到特定的 POJO 还不是很清楚..
    【解决方案3】:

    杰克逊的 BeanDeserializer 已被弃用。 但是,我遇到了同样的问题,我使用 Google 的GSon 解决了它。看看这个例子。

    鉴于您的 POJO 数据类型:

    class BagOfPrimitives {
      private int value1 = 1;
      private String value2 = "abc";
      private transient int value3 = 3;
      BagOfPrimitives() {
        // no-args constructor
      }
    }
    
    • 序列化

      BagOfPrimitives obj = new BagOfPrimitives();
      Gson gson = new Gson();
      String json = gson.toJson(obj);  // ==> json is {"value1":1,"value2":"abc"}
      

    请注意,您不能使用循环引用序列化对象,因为这将导致无限递归。

    • 反序列化

      BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);
      

    【讨论】:

      猜你喜欢
      • 2012-04-07
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2023-02-08
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多