0

動的に生成されるJSONツリー構造があります。これは、キーと構造が不明であり、リクエストごとに変更される可能性があることを意味します。すべてのオブジェクトに共通するプロパティは、oldValueキーとnewValueキーのみです...

JSONは次のようになります。

{
"obj1": 
    {"oldValue": "foo", "newValue": "foofoo"},
"obj2": 
    {"obj2_1": 
        {"oldValue": null, "newValue": "foo"}
    },
    {"obj2_2": 
        {"obj2_2_1": 
            {"oldValue": "foo", "newValue": "foofoo"}           
        },
        {"obj2_2_2": 
            {"oldValue": "foo1", "newValue": null}          
        }
    }
}

このデータをTreeGridに動的にロードするにはどうすればよいですか?XPathを使用して最も深いキーに到達することは可能ですか?

4

1 に答える 1

0

階層データを処理できるSmartGWTコンポーネントでは、属性として親キーを指定する必要があるため、SmartGWTでは不可能であるという結論に達しました。これはあまり実用的ではありません(IMHO)...

解決策:これに対する最善の代替策は、GWTコアウィジェットTreeTreeItemを使用することです。TreeItemを使用すると、アイテムを動的にアタッチできるため、jsonデータをJSONObjectにロードし、ノードを再帰的に追加しました。

ツリーノードの読み込みプロセスの下:

private void loadTreeNodes(JSONObject jsonObject, TreeItem parent) {        
    for (String key: jsonObject.keySet()) {                
        JSONValue jsonValue = jsonObject.get(key);    
        TreeItem item = new TreeItem("<b>" + key + "</b> ");
        parent.addItem(item);

        if (jsonValue != null) {
            if (jsonValue.isObject() != null) {
                loadTreeNodes(jsonValue.isObject(), item);
            } else if (jsonValue.isArray() != null) {

            } else {
                if ("oldValue".equals(key)) {
                    item.setHTML("<b>before:</b> " + jsonValue.toString());
                } else {
                    item.setHTML("<b>after:</b> " + jsonValue.toString());
                }                    
            }
        } else {
            item.setText("<b>" + item.getText() + ":</b> null");
        }
    }        
}

私は次のようにjsonデータをロードしました:

JavaScriptObject obj = JSON.decode(jsonData);
JSONObject jsonObject = new JSONObject(obj);

コメントは大歓迎です!

于 2011-12-23T01:10:30.660 に答える