Итерация рекурсивно через глубокий HashMap - PullRequest
1 голос
/ 18 февраля 2012

У меня есть строка JSON, похожая на следующую:

{
    "foo" : "bar",
    "id" : 1,
    "children":[
        {
            "some" : "string",
            "id" : 2,
            children : []
        },
        {
            "some" : "string",
            "id" : 2,
            children : []
        }
    ]
}

Я выполняю JSON-анализ этой строки, и все объекты превращаются в HashMaps, а все массивы - в HashMap [].Моя проблема в том, что мне нужна одна рекурсивная функция для перебора всех узлов этой структуры JSON в Java.Как я могу это сделать?Я думал что-то вроде:

public HashMap findNode(boolean isArray, HashMap map, HashMap[] array){
    //array stuff
    if(isArray){
        for(int i=0; i<array.length(); i++){
            Object value = array[i];
            if(value instanceof String)
                System.out.println("value = "+value);
            else if(value instanceof HashMap)
                findNode(false, value, null);
            else if(value instanceof HashMap[])
                findNode(true, null, value);
        }
    //hashmap stuff
    }else{
        for(HashMap.Entry<String, Object> entry : map.entrySet()){
            Object value = entry.getValue();
            if(value instanceof String)
                System.out.println("value = "+value);
            else if(value instanceof HashMap)
                findNode(false, value, null);
            else if(value instanceof HashMap[])
                findNode(true, null, value);
        }
    }
}

1 Ответ

3 голосов
/ 18 февраля 2012

Предполагая, что в массиве могут быть только Карты внутри (и не в других массивах):

public void findNode(HashMap map) {
    for(HashMap.Entry<String, Object> entry : map.entrySet()){
        Object value = entry.getValue();
        if(value instanceof String)
            System.out.println("value = "+value);
        else if(value instanceof HashMap)
            findNode(value);
        else if(value instanceof HashMap[])
            for(int i=0; i<array.length(); i++){
                findNode(array[i]);
    }
}

Или вы можете сделать его еще проще, если можете использовать 3 функции

public void findNode(HashMap map) {
    for(HashMap.Entry<String, Object> entry : map.entrySet()){
        findNode(entry.getValue());
    }
}

public void findNode(String value) {
    System.out.println("value = "+value);
}

public void findNode(HashMap[] value) {
    for(int i=0; i<array.length(); i++){
        findNode(array[i]);
    }
}
...