2016-01-05 51 views
0

我有一個JSON文件中像下面和需要解析的疊加像overlay1,overlay2,overlay3內部的對象:解析JSON對象使用GSON並獲得長度

{ 
    "overlays": { 
      "overlay1": { 
      "imagesFPS": 12, 
      "clickThrough": false, 
      "repeatCount": 0, 
        "sensitivity": 0.6, 
     }, 
     "overlay2": { 
      "cgButtonPressedColor": "#ffaa56", 
       "relative": "screen", 
       "isOverlayRendered": true, 
       "cgBorderWidth": "0px", 
     }, 
     "overlay3": { 
      "cgButtonPressedColor": "#007f00", 
      "text": "Goto Page3 on Touch 5 Release", 
     } 
    } 
} 

目前,我這樣做:

Gson gson = new GsonBuilder().create(); 
JsonObject job = gson.fromJson(fileReader, JsonObject.class); 
JsonObject ovl = job.getAsJsonObject("overlays"); 
for (int i = 1; i <= 100; i++) { 
    JsonObject overlay = ovl.getAsJsonObject("overlay" + i); 
    if (overlay != null) { 
     osb.setOverlay(jsp.getOverlay(overlay)); 
    } 
} 

我怎樣才能得到覆蓋層的長度(這裏:overlay1,overlay2,overlay3)?如何通過gson API查詢3的長度?

我想知道overlay1,overlay2,overlay3在一個字符串或數組,以便我可以遍歷它們。

注意:在這裏,我必須迭代100次或任何時間,以便迭代如果疊加層稍後在json文件中增加。它在循環中進行不必要的迭代。
如何迭代只有overlay1overlay2overlay3等沒有不必要的迭代?
我的意思是我只想通過Gson在jsonobjects中獲得overlay1,overlay2,overlay3等等。

回答

1

我已經解決這使用下面的代碼。

Gson gson = new GsonBuilder().create(); 
JsonObject job = gson.fromJson(fileReader, JsonObject.class); 
JsonObject ovl = job.getAsJsonObject("overlays"); 
Map<String, Object> data = new Gson().fromJson(ovl, type); 
Iterator<String> entries = data.keySet().iterator(); 
while (entries.hasNext()) 
{ JsonObject overlay = ovl.getAsJsonObject(entries.next().toString()); 
    if (overlay != null) 
    { 
     osb.setOverlay(jsp.getOverlay(overlay)); 
    } 
} 
0

您是否考慮過使用數組而不是包裝對象?

{ 
    "overlays": [ 
     {"overlay1": { 
      "imagesFPS": 12, 
      "clickThrough": false, 
      "repeatCount": 0, 
      "sensitivity": 0.6, 
     }}, 
     {"overlay2": { 
      "cgButtonPressedColor": "#ffaa56", 
      "relative": "screen", 
      "isOverlayRendered": true, 
      "cgBorderWidth": "0px", 
     }}, 
     {"overlay3": { 
      "cgButtonPressedColor": "#007f00", 
      "text": "Goto Page3 on Touch 5 Release", 
     }} 
    ] 
} 

並使用此代碼:

Gson gson = new Gson(); 
JsonObject job = gson.fromJson(fileReader, JsonObject.class); 
JsonArray ovl = job.getAsJsonArray("overlays"); 

if (ovl != null) { 
    osb.setOverlay(jsb.getOverlay(ovl.get(ovl.lenght() - 1))); 
} 

或者,如果你想使用包裹JSON對象,你應該創建一個列表,並插入這樣的內容:

Gson gson = new Gson(); 
List<JsonObject> overlays = new LinkedList<>(); 
JsonObject job = gson.fromJson(fileReader, JsonObject.class); 
JsonObject ovl = job.getAsJsonObject("overlays"); 

for (int i = 1; ; ++i) { 
    JsonObject overlay = ovl.getAsJsonObject("overlay" + i); 
    if (overlay == null) { 
     break; 
    } else { 
     overlays.put(overlay); 
    } 
} 

// Use "overlays" list 
+0

感謝您的回覆。但如果我的JSON包含overlay4而不是覆蓋3,那麼這個代碼將無法工作..我需要的是獲得覆蓋名稱,如overlay1,overlay2等..實際上我已經使用列表來推動我的代碼內覆蓋但我需要名稱推動.. –

+0

我已經通過以下 解決了此問題'Gson gson = new GsonBuilder()。create(); JsonObject job = gson.fromJson(fileReader,JsonObject.class); JsonObject ovl = job.getAsJsonObject(「overlays」)' Map data = new Gson()。fromJson(ovl,type); \t \t迭代器 entries = data.keySet()。iterator(); \t \t而(entries.hasNext()){ \t \t \t的JSONObject覆蓋= ovl.getAsJsonObject(entries.next()的toString()); \t \t \t如果(重疊!= NULL){ \t \t \t \t osb.setOverlay(jsp.getOverlay(覆蓋)); \t \t \t} \t \t}' –