2013-03-27 5 views
3

Supposons que j'ai un tableau JSON comme ceci:Recherche clé/valeur profondément imbriquée dans JSON

[ 
    { 
     "id": "429d30a1-9364-4d9a-92e0-a17e00b3afba", 
     "children": [], 
     "parentid": "", 
     "name": "Expo Demo" 
    }, 
    { 
     "id": "f80f1034-9110-4349-93d8-a17e00c9c317", 
     "children": 
      [ 
       { 
        "id":"b60f2c1d-368b-42c4-b0b2-a1850073e1fe", 
        "children":[], 
        "parentid":"f80f1034-9110-4349-93d8-a17e00c9c317", 
        "name":"Tank" 
       } 
      ], 
     "parentid": "", 
     "name": "Fishtank" 
    }, 
    { 
     "id": "fc8b0697-9406-4bf0-b79c-a185007380b8", 
     "children": [ 
      { 
       "id":"5ac52894-4cb6-46c2-a05a-a18500739193", 
       "children":[ 
        { 
         "id": "facb264c-0577-4627-94a1-a1850073c270", 
         "children":[ 
          { 
           "id":"720472b5-189e-47f1-97a5-a18500a1b7e9", 
           "children":[], 
           "parentid":"facb264c-0577-4627-94a1-a1850073c270", 
           "name":"ubSubSub" 
          }], 
         "parentid": "5ac52894-4cb6-46c2-a05a-a18500739193", 
         "name": "Sub-Sub1" 
        }], 
       "parentid":"fc8b0697-9406-4bf0-b79c-a185007380b8", "name":"Sub" 
      }, 
      { 
       "id":"4d024610-a39b-49ce-8581-a18500739a75", 
       "children":[], 
       "parentid":"fc8b0697-9406-4bf0-b79c-a185007380b8", 
       "name":"Sub2" 
      } 
     ], 
     "parentid": "", 
     "name": "Herman" 
    }, 
    { 
     "id": "a5b140c9-9987-4e6d-a883-a18c00726883", 
     "children": [ 
      { 
       "id":"fe103303-fd5e-4cd6-81a0-a18c00733737", 
       "children":[], 
       "parentid":"a5b140c9-9987-4e6d-a883-a18c00726883", 
       "name":"Contains Spaces" 
      }], 
     "parentid": "", 
     "name": "Kiosk" 
    } 
] 

Non Je veux trouver un certain objet basé sur un identifiant et une fois que j'ai, je besoin de ses enfants et tous ses childrends enfants

donc dire que je LETs veux trouver l'élément avec un id si 4d024610-a39b-49ce-8581-a18500739a75

Cela devrait trouver l'élément Sub2

Et maintenant, il devrait produire tous les éléments de l'enfant sorcière ids sera:

facb264c-0577-4627-94a1-a1850073c270 
720472b5-189e-47f1-97a5-a18500a1b7e9 

Disons que je ferais

findElementsChildren("4d024610-a39b-49ce-8581-a18500739a75") 

donc je suppose que ses deux parties, d'abord trouver le « parent » élément. Alors trouvez ses enfants childrends enfants etc ..

Toute aide serait très appréciée!

+0

Eh bien, je peux trouver l'élément, mais je ne sais pas comment je trouverais les enfants de ses enfants. Les enfants pourraient être imbriqués sans limite. J'ai fait le même genre de chose en Javascript. – Harry

+0

Peut-être pourriez-vous essayer d'utiliser une bibliothèque [JsonPath] (http://code.google.com/p/json-path/) pour interroger la structure? – Jonathan

+0

Le javascript était en fait juste de trouver un élément imbriqué profondément dans un tableau/objet json. Cela va un peu plus loin, en trouvant tous ses enfants. Je ne sais pas comment je ferais cela, donc l'algorithme – Harry

Répondre

2

Vous pouvez utiliser la récursivité pour résoudre le problème de l'imbrication illimitée. Avec Gson, cela ressemblerait à l'extrait de code suivant (non testé). D'autres bibliothèques fourniront aussi des structures comme JsonElement.

private JsonElement findElementsChildren(JsonElement element, String id) { 
    if(element.isJsonObject()) { 
     JsonObject jsonObject = element.getAsJsonObject(); 
     if(id.equals(jsonObject.get("id").getAsString())) { 
      return jsonObject.get("children"); 
     } else { 
      return findElementsChildren(element.get("children").getAsJsonArray(), id); 
     } 
    } else if(element.isJsonArray()) { 
     JsonArray jsonArray = element.getAsJsonArray(); 
     for (JsonElement childElement : jsonArray) { 
      JsonElement result = findElementsChildren(childElement, id); 
      if(result != null) { 
       return result; 
      } 
     } 
    } 

    return null; 
} 
+0

Whart est JsonElement? un JSONArray? – Harry

+0

JsonElement peut être n'importe quoi, un objet JSON, un tableau ou une primitive (string, int, ..). –

+0

Ok je le change un peu, mais en gros le même et ça marche bien! Merci – Harry

0

Sur la base de la réponse de Stefan Jansen j'ai fait quelques changements et c'est ce que j'ai maintenant:

nestedChildren a déclaré globaly, et avant que les enfants sont recherchés remis à new ArrayList()

private void findAllChild(JSONArray array) throws JSONException { 

    for (int i=0;i<array.length();i++) { 
     JSONObject json = array.getJSONObject(i); 
     JSONArray json_array = new JSONArray(json.getString("children")); 
     nestedChildren.add(json.getString("id")); 
     if (json_array.length() > 0) { 
      findAllChild(json_array); 
     } 
    } 
} 

Cela suppose que c'est tous les tableaux, dans mon cas, il est

Questions connexes