2

TreeNodes と NodeData を含む Java ツリー構造に JSON をデシリアライズする必要があります。TreeNodes は、NodeData の薄いラッパーです。JSON と以下のクラスを提供します。hereを含む通常の Gson ヘルプ ソースを見てきましたが、解決策が思いつかないようです。

シリアル化は Gson で正常に動作します。以下の JSON は Gson によって作成されました。しかし、デシリアライゼーションは私が助けを必要としている問題です。デシリアライザーの書き方を教えてもらえますか (または、Gson のベスト プラクティスを使用した代替アプローチを提案してください)。

これが私のJSONです。「data」要素はクラス NodeData に対応し、「subList」JSON 要素は Java クラス TreeNode に対応します。

{
  "data": {
    "version": "032",
    "name": "root",
    "path": "/",
    "id": "1",
    "parentId": "0",
    "toolTipText": "rootNode"
  },
  "subList": [
    {
      "data": {
        "version": "032",
        "name": "level1",
        "labelText": "Some Label Text at Level1",
        "path": "/root",
        "id": "2",
        "parentId": "1",
        "toolTipText": "a tool tip for level1"
      },
      "subList": [
        {
          "data": {
            "version": "032",
            "name": "level1_1",
            "labelText": "Label level1_1",
            "path": "/root/level1",
            "id": "3",
            "parentId": "2",
            "toolTipText": "ToolTipText for level1_1"
          }
        },
        {
          "data": {
            "version": "032",
            "name": "level1_2",
            "labelText": "Label level1_2",
            "path": "/root/level1",
            "id": "4",
            "parentId": "2",
            "toolTipText": "ToolTipText for level1_2"
          }
        }
      ]
    },
    {
      "data": {
        "version": "032",
        "name": "level2",
        "path": "/root",
        "id": "5",
        "parentId": "1",
        "toolTipText": "ToolTipText for level2"
      },
      "subList": [
        {
          "data": {
            "version": "032",
            "name": "level2_1",
            "labelText": "Label level2_1",
            "path": "/root/level2",
            "id": "6",
            "parentId": "5",
            "toolTipText": "ToolTipText for level2_1"
          },
          "subList": [
            {
              "data": {
                "version": "032",
                "name": "level2_1_1",
                "labelText": "Label level2_1_1",
                "path": "/root/level2/level2_1",
                "id": "7",
                "parentId": "6",
                "toolTipText": "ToolTipText for level2_1_1"
              }
            }
          ]
        }
      ]
    }
  ]
}

Java クラスは次のとおりです。

public class Tree {

    private TreeNode rootElement;
    private HashMap<String, TreeNode> indexById;
    private HashMap<String, TreeNode> indexByKey;
    private long nextAvailableID = 0;

    public Tree() {
        indexById = new HashMap<String, TreeNode>();
        indexByKey = new HashMap<String, TreeNode>();
    }

    public long getNextAvailableID()
    {
        return this.nextAvailableID;
    }
    ...
    [snip]
    ...
}

public class TreeNode {

    private Tree tree;
    private NodeData data;
    public List<TreeNode> subList;
    private HashMap<String, TreeNode> indexById;
    private HashMap<String, TreeNode> indexByKey;

    //this default ctor is used only for Gson deserialization
    public TreeNode() {
        this.tree = new Tree();
        indexById = tree.getIdIndex();
        indexByKey = tree.getKeyIndex();
        this.makeRoot();
        tree.setRootElement(this);
    }

    //makes this node the root node. Calling this obviously has side effects.
    public NodeData makeRoot() {
        NodeData rootProp = new NodeData(TreeFactory.version, "example", "rootNode");

        String nextAvailableID = getNextAvailableID();
        if (!nextAvailableID.equals("1")) {
            throw new IllegalStateException();
        }

        rootProp.setId(nextAvailableID);
        rootProp.setParentId("0");
        rootProp.setKeyPathOnly("/");
        rootProp.setSchema(tree);
        this.data = rootProp;
        rootProp.setNode(this);
        indexById.put(rootProp.getId(), this);
        indexByKey.put(rootProp.getKeyFullName(), this);
        return rootProp;
    }

    ...
    [snip]
    ...
}

public class NodeData {

    protected static Tree tree;
    private LinkedHashMap<String, String> keyValMap;

    protected String version;
    protected String name;
    protected String labelText;
    protected String path;
    protected String id;
    protected String parentId;
    protected TreeNode node;
    protected String toolTipText;//tool tip or help string
    protected String imagePath;//for things like images; not persisted to properties
    protected static final String delimiter = "/";

    //this default ctor is used only for Gson deserialization
    public NodeData() {
        this("NOT_SET", "NOT_SET", "NOT_SET");
    }

    ...
    [snip]
    ...
}

補足: ツリー データ構造にはインデックスが含まれているため、少し奇妙です。明らかに、これは典型的な検索ツリーではありません。実際、ツリーは主に、各 NodeData 要素に階層パス要素 (文字列) を作成するために使用されます。(例: "path": "/root/level2/level2_1"。) インデックスは、実際には NodeData の取得に使用されます。

4

0 に答える 0