亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用 Jackson 序列化/反序列化 DefaultMutableTreeNode?

如何用 Jackson 序列化/反序列化 DefaultMutableTreeNode?

慕姐8265434 2022-07-20 20:35:59
我們如何DefaultMutableTreeNode使用 Jackson 將 Swing 序列化/反序列化到 JSON 或從 JSON 序列化/反序列化?有一個相關的問題 How to serialize DefaultMutableTreeNode (Java) to JSON? . 但它要求 Gson,而不是 Jackson(僅用于序列化,而不用于反序列化)。對于DefaultMutableTreeNodeJackson 的默認序列化/序列化不起作用,原因有很多:它包含再次是DefaultMutableTreeNode對象的子項。但它沒有規范的 getter 和 setter 方法(如getChildren()and setChildren(...))。它包含反向引用(通過方法getParent(), getRoot(), getPath()),這將導致序列化期間的無限遞歸和 StackOverflow。它有許多不需要序列化的冗余 getter 方法(如isLeaf(), getNextSibling(), , ...),因為它們是從其他屬性派生的。getLastChild()
查看完整描述

1 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

您可以ObjectMapper使用 a 自定義 Jackson'sJsonSerializer并JsonDeserializer專門用于將 a 轉換DefaultMutableTreeNode為 JSON,反之亦然。


ObjectMapper objectMapper = new ObjectMapper()

    .registerModule(new SimpleModule()

        .addSerializer(DefaultMutableTreeNode.class, new DefaultMutableTreeNodeSerializer())

        .addDeserializer(DefaultMutableTreeNode.class, new DefaultMutableTreeNodeDeserializer()))

    .enable(SerializationFeature.INDENT_OUTPUT);

下面DefaultMutableTreeNodeSerializer負責將 a 轉換DefaultMutableTreeNode為 JSON。它將allowsChildren,userObject和children of寫入DefaultMutableTreeNodeJSON。它不寫它parent,因為那會導致無限遞歸和 StackOverflowError。相反,父子關系被編碼在 JSON 輸出的嵌套結構中。


public class DefaultMutableTreeNodeSerializer extends JsonSerializer<DefaultMutableTreeNode> {


    @Override

    public void serialize(DefaultMutableTreeNode node, JsonGenerator gen, SerializerProvider serializers)

            throws IOException {

        gen.writeStartObject();

        gen.writeBooleanField("allowsChildren", node.getAllowsChildren());

        gen.writeObjectField("userObject", node.getUserObject());

        if (node.getChildCount() > 0)

            gen.writeObjectField("children", Collections.list(node.children()));

        // Don't write node.getParent(), it would lead to infinite recursion.

        gen.writeEndObject();

    }

}

為了測試,您可以序列化 sample 的根節點JTree,然后再次反序列化。

http://img1.sycdn.imooc.com//62d7f6d40001282502020345.jpg

JTree tree = new JTree(); // a sample tree

Object root = tree.getModel().getRoot(); // a DefaultMutableTreeNode

String json = objectMapper.writeValueAsString(root);

System.out.println(json);

DefaultMutableTreeNode root2 = objectMapper.readValue(json, DefaultMutableTreeNode.class);

它生成以下 JSON 輸出:


{

  "allowsChildren" : true,

  "userObject" : "JTree",

  "children" : [ {

    "allowsChildren" : true,

    "userObject" : "colors",

    "children" : [ {

      "allowsChildren" : true,

      "userObject" : "blue"

    }, {

      "allowsChildren" : true,

      "userObject" : "violet"

    }, {

      "allowsChildren" : true,

      "userObject" : "red"

    }, {

      "allowsChildren" : true,

      "userObject" : "yellow"

    } ]

  }, {

    "allowsChildren" : true,

    "userObject" : "sports",

    "children" : [ {

      "allowsChildren" : true,

      "userObject" : "basketball"

    }, {

      "allowsChildren" : true,

      "userObject" : "soccer"

    }, {

      "allowsChildren" : true,

      "userObject" : "football"

    }, {

      "allowsChildren" : true,

      "userObject" : "hockey"

    } ]

  }, {

    "allowsChildren" : true,

    "userObject" : "food",

    "children" : [ {

      "allowsChildren" : true,

      "userObject" : "hot dogs"

    }, {

      "allowsChildren" : true,

      "userObject" : "pizza"

    }, {

      "allowsChildren" : true,

      "userObject" : "ravioli"

    }, {

      "allowsChildren" : true,

      "userObject" : "bananas"

    } ]

  } ]

}

下面DefaultMutableTreeNodeDeserializer負責將 JSON 轉換回DefaultMutableTreeNode.


這DefaultMutableTreeNode非常不像 POJO,因此不能與杰克遜一起很好地工作。因此,我創建了一個表現良好的POJO幫助器類(具有屬性 和) allowsChildren,并讓 Jackson 將 JSON 內容反序列化到該類中。然后我將對象(及其 子對象)轉換為對象(帶有子對象)。userObjectchildrenPOJOPOJODefaultMutableTreeNodeDefaultMutableTreeNode


public class DefaultMutableTreeNodeDeserializer extends JsonDeserializer<DefaultMutableTreeNode> {


    @Override

    public DefaultMutableTreeNode deserialize(JsonParser parser, DeserializationContext context)

            throws IOException {

        return parser.readValueAs(POJO.class).toDefaultMutableTreeNode();

    }


    private static class POJO {


        private boolean allowsChildren;

        private Object userObject;

        private List<POJO> children;

        // no need for: POJO parent


        public DefaultMutableTreeNode toDefaultMutableTreeNode() {

            DefaultMutableTreeNode node = new DefaultMutableTreeNode();

            node.setAllowsChildren(allowsChildren);

            node.setUserObject(userObject);

            if (children != null) {

                for (POJO child : children) {

                    node.add(child.toDefaultMutableTreeNode());  // recursion

                    // this did also set the parent of the child-node

                }

            }

            return node;

        }


        // Following setters needed by Jackson's deserialization:


        public void setAllowsChildren(boolean allowsChildren) {

            this.allowsChildren = allowsChildren;

        }


        public void setUserObject(Object userObject) {

            this.userObject = userObject;

        }


        public void setChildren(List<POJO> children) {

            this.children = children;

        }

    }

}


查看完整回答
反對 回復 2022-07-20
  • 1 回答
  • 0 關注
  • 83 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號