2012-02-18 2 views
1

У меня есть строка JSON, похожее на следующее:Iterate рекурсивно через глубокий HashMap

{ 
    "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); 
     } 
    } 
} 

ответ

2

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

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]); 
    } 
} 
+1

На самом деле, вторая часть не будет работать, вы получите ошибку компиляции при неоднозначном вызове (поскольку я перегружаю fucntion, не используя полиморфизм). сожалею – Luis