如何在SmartGWT TreeGrid中加载JSON动态树数据

时间:2011-12-21 23:44:43

标签: gwt smartgwt treegrid

我有一个以dinamically方式生成的JSON树结构,这意味着键和结构是未知的,它可以在每个请求中更改,每个对象中唯一的公共属性是 oldValue 和< em> 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}          
        }
    }
}

如何在树形网格中加载此数据?是否可以使用XPath获取最深的密钥?

1 个答案:

答案 0 :(得分:0)

我得出的结论是,SmartGWT是不可能的,因为在可以处理分层数据的SmartGWT组件中,您需要指定父键作为属性,这不是很实用(恕我直言)。 ..

现在解决方案:最好的替代方法是使用GWT核心小部件 TreeItem ,使用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);

欢迎任何评论!