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 の取得に使用されます。