Как загрузить данные динамического дерева JSON в SmartGWT TreeGrid - PullRequest
0 голосов
/ 22 декабря 2011

У меня есть древовидная структура JSON, которая генерируется динамически, это означает, что ключи и структура неизвестны и могут меняться в каждом запросе, единственное общее свойство в каждом объекте - это oldValue и newValue keys ...

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?

1 Ответ

0 голосов
/ 23 декабря 2011

Я пришел к выводу, что с SmartGWT это просто невозможно из-за того факта, что в компонентах SmartGWT, которые могут обрабатывать иерархические данные, вам необходимо указывать родительский ключ в качестве атрибута, что не очень практично (IMHO). ..

Теперь решение: лучшая альтернатива этому - использовать основные виджеты GWT Tree и 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);

Любые комментарии приветствуются!

...