简体   繁体   English

使用Gson解析对象内部的Json对象并获取长度

[英]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 : 我有一个像下面的json文件,想解析诸如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 )? 如何获取叠加层的长度(此处为overlay1overlay2overlay3 )? How do I query the length of 3 via the gson API? 如何通过gson API查询3的长度?

And I want to know the overlay1,overlay2,overlay3 in a string or array so that I can iterate over them. 而且我想知道字符串或数组中的overlay1,overlay2,overlay3 ,以便可以迭代它们。

Note: Here I have to iterate 100 times or any times so that I can iterate if overlays increase later in json file. 注意:在这里,我必须迭代100次或任意次,以便以后在json文件中叠加增加时可以进行迭代。 It iterates unnecessarily in looping. 它在循环中不必要地进行迭代。
How can I iterate only overlay1 or overlay2 or overlay3 and so without unnecessary iterating? 如何仅迭代overlay1overlay2overlay3等,而又没有不必要的迭代?
I mean I just want to get the overlay1 , overlay2 , overlay3 and so on in jsonobjects via Gson. 我的意思是我只想通过Gson在jsonobjects获取overlay1overlay2overlay3等。

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: 或者,如果要使用包装的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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