简体   繁体   中英

Parsing Json objects inside objects using Gson and get the length

I have a json file like below and want to parse the overlays like overlay1,overlay2,overlay3 :

{
    "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",
         }
    }
}

Currently I am doing this:

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

How can I get the length of overlays (here: overlay1 , overlay2 , overlay3 )? How do I query the length of 3 via the gson API?

And I want to know the overlay1,overlay2,overlay3 in a string or array so that I can iterate over them.

Note: Here I have to iterate 100 times or any times so that I can iterate if overlays increase later in json file. It iterates unnecessarily in looping.
How can I iterate only overlay1 or overlay2 or overlay3 and so without unnecessary iterating?
I mean I just want to get the overlay1 , overlay2 , overlay3 and so on in jsonobjects via Gson.

I have solved this using this code below.

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

Have you considered using an array instead of wrapped objects?

{
    "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",
         }}
    ]
}

And using this code:

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

Or if you want to use wrapped json objects, you should create a list and insert elements like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM