2013-03-31 2 views
2

У меня есть объект JSON, который я хотел бы получить из имен ключей и хранить их в ArrayList. Я использовал следующий кодполучить ключевые имена от объекта JSON, используя Gson

jsonData(String filename) { 
    JsonParser parser = new JsonParser(); 
    JsonElement jsonElement = null; 

    try { 
     jsonElement = parser.parse(new FileReader(filename)); 
    } catch (JsonIOException | JsonSyntaxException | FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    JsonObject jsonObject = jsonElement.getAsJsonObject(); 

    int i = 0; 
    for (Entry<String, JsonElement> entry : jsonObject.entrySet()) { 
     String key = entry.getKey(); 
     JsonElement value = entry.getValue(); 

     keys.add(key); 
     i++; 
    } 
    nKeys = i; 
} 

Если я использую этот код с помощью простого объекта JSON

{ 
    "age":100, 
    "name":"mkyong.com", 
    "messages":["msg 1","msg 2","msg 3"] 
} 

Это прекрасно работает. возраст, имя и сообщения (а не значения) добавляются в мой ArrayList. Как только я попытаюсь использовать этот же код с более сложным JSON, как это

{"widget": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    "image": { 
     "src": "Images/Sun.png", 
     "name": "sun1", 
     "hOffset": 250, 
     "vOffset": 250, 
     "alignment": "center" 
    }, 
    "text": { 
     "data": "Click Here", 
     "size": 36, 
     "style": "bold", 
     "name": "text1", 
     "hOffset": 250, 
     "vOffset": 100, 
     "alignment": "center", 
     "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}} 

Я получаю только корневой ключ. Может ли кто-нибудь указать мне в правильном направлении?

Спасибо всем!

+0

Я думаю, что вы должны рекурсивно перебирать ключи – adaniluk

+0

Из каких библиотек «JsonParser», «JsonElement» a nd 'JsonObject' есть? – danieln

ответ

12

Вместо того, чтобы извиваться через API Gson (JSON) с циклами и условностями, я бы предпочел использовать Gson для того, что, по моему мнению, это лучше всего: обеспечить очень простую (де) сериализацию с помощью всего нескольких строк кода , Я хотел бы задать decouple любые проблемы с обработкой данных/запросов/представления из-за проблемы сериализации (de). Другими словами, насколько это разумно, манипулировать данными по мере необходимости, перед его сериализацией и аналогичным образом манипулировать данными по мере необходимости после десериализации.

Итак, если по какой-то причине мне нужны все ключи из структуры JSON, и я хотел использовать Gson, я бы, скорее всего, подошел к ней следующим образом. (Конечно, я не могу в настоящее время думать о какой-либо причине, почему такое может быть полезным.)

import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
import java.util.Map; 

import com.google.gson.Gson; 

public class App 
{ 
    public static void main(String[] args) throws Exception 
    { 
    List keys1 = getKeysFromJson("input_without_lists.json"); 
    System.out.println(keys1.size()); 
    System.out.println(keys1); 

    List keys2 = getKeysFromJson("input_with_lists.json"); 
    System.out.println(keys2.size()); 
    System.out.println(keys2); 
    } 

    static List getKeysFromJson(String fileName) throws Exception 
    { 
    Object things = new Gson().fromJson(new FileReader(fileName), Object.class); 
    List keys = new ArrayList(); 
    collectAllTheKeys(keys, things); 
    return keys; 
    } 

    static void collectAllTheKeys(List keys, Object o) 
    { 
    Collection values = null; 
    if (o instanceof Map) 
    { 
     Map map = (Map) o; 
     keys.addAll(map.keySet()); // collect keys at current level in hierarchy 
     values = map.values(); 
    } 
    else if (o instanceof Collection) 
     values = (Collection) o; 
    else // nothing further to collect keys from 
     return; 

    for (Object value : values) 
     collectAllTheKeys(keys, value); 
    } 
} 

input_without_lists.json

{ 
    "widget": { 
     "debug": "on", 
     "window": { 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 
      "width": 500, 
      "height": 500 
     }, 
     "image": { 
      "src": "Images/Sun.png", 
      "name": "sun1", 
      "hOffset": 250, 
      "vOffset": 250, 
      "alignment": "center" 
     }, 
     "text": { 
      "data": "Click Here", 
      "size": 36, 
      "style": "bold", 
      "name": "text1", 
      "hOffset": 250, 
      "vOffset": 100, 
      "alignment": "center", 
      "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
     } 
    } 
} 

input_with_lists.json

[{ 
    "widget": { 
     "debug": "on", 
     "windows": [{ 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 
      "width": 500, 
      "height": 500 
     },{ 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 
      "width": 500, 
      "height": 500 
     },{ 
      "title": "Sample Konfabulator Widget", 
      "name": "main_window", 
      "width": 500, 
      "height": 500 
     }] 
    } 
}] 
+0

Спасибо! Я попробую сейчас. То, что я пытаюсь сделать, - разобрать объект JSON и поместить значения каждого ключа в массив для последующего использования. После того, как у меня есть каждый ключ, я хочу вывести их, а затем позволить пользователю указать, какие данные они хотят. Все примеры, которые я нашел, показывают, как извлекать данные из ключа, но вам нужен ключ раньше времени. – user2229544

Смежные вопросы