2015-06-27 29 views
10

Mam GSON jako parser JSON w Javie, ale klucze nie zawsze są takie same.
Na przykład. Mam następujący JSON:Java GSON: Uzyskiwanie listy wszystkich kluczy pod JSONObject

{ "obiekt już wiem": {
"klucz1": "value1"
"klucz2": "wartość2"
"AnotherObject": { " anotherKey1 ":" anotherValue1" , "anotherKey2": "anotherValue2"}
}

już dostał JSONObject "Przedmiotem już wiem". Teraz potrzebuję uzyskać wszystkie JSONElements dla tego obiektu, będzie to "Key1", "Key2" i "AnotherObject".
Z góry dziękuję.
EDIT: wyjście powinno być Array String ze wszystkich kluczy do JSONObject

+0

możliwe duplikat [ Jak rozszyfrować JSON z nieznanym polem używając Gson?] (Http://stackoverflow.com/questions/20442265/how-to-decode-json-with-unknown-field-using-gson) – pkubik

+0

może to być pomocne http://stackoverflow.com/questions/14619811/retrieving-all-the-keys-in-a-sted-json-in-java –

+0

jaki powinien być twój ostateczny wynik? powinno to być: '" klucz1 "," klucz2 "," następny obiekt "' LUB '" Obiekt, który już znam "," klucz1 "," klucz2 "," kolejnyobiekt "' ?? –

Odpowiedz

38

Można użyć JsonParser konwertować JSON do pośredniej struktury, które pozwalają zbadać zawartość json.

String yourJson = "{your json here}"; 
JsonParser parser = new JsonParser(); 
JsonElement element = parser.parse(yourJson); 
JsonObject obj = element.getAsJsonObject(); //since you know it's a JsonObject 
Set<Map.Entry<String, JsonElement>> entries = obj.entrySet();//will return members of your object 
for (Map.Entry<String, JsonElement> entry: entries) { 
    System.out.println(entry.getKey()); 
} 
+0

JsonParser to dość podstępna mała bestia :) –

+1

Dlaczego nie obj.keySet()? – Zon

+0

obj.keySet() wydaje się być lepszym wyborem – mkamioner

4
String str = "{\"key1\":\"val1\", \"key2\":\"val2\"}"; 

     JsonParser parser = new JsonParser(); 
     JsonObject jObj = (JsonObject)parser.parse(str); 

     List<String> keys = new ArrayList<String>(); 
     for (Entry<String, JsonElement> e : jObj.entrySet()) { 
      keys.add(e.getKey()); 
     } 

     // keys contains jsonObject's keys 
10

Ponieważ Java 8 można używać strumieni jak lepiej wygląda alternatywa:

String str = "{\"key1\":\"val1\", \"key2\":\"val2\"}"; 

JsonParser parser = new JsonParser(); 
JsonObject jObj = (JsonObject) parser.parse(str); 

List<String> keys = jObj.entrySet() 
    .stream() 
    .map(i -> i.getKey()) 
    .collect(Collectors.toCollection(ArrayList::new)); 

keys.forEach(System.out::println); 
4

Od 2.8.1 Gson można użyć keySet():

String json = "{\"key1\":\"val\", \"key2\":\"val\"}"; 

JsonParser parser = new JsonParser(); 
JsonObject jsonObject = parser.parse(json).getAsJsonObject(); 

Set<String> keys = jsonObject.keySet();