簡體   English   中英

使用 gson java 解析和獲取嵌套的 json 對象

[英]Parsing and getting nested json objects using gson java

我有這個 json 文件:

{
  "Update tree": {
    "average time": 0.01610115085649609,
    "best time": 0.003310859220941582,
    "count": 651,
    "success rate": 100,
    "worst time": 0.621779361692829
  },
  "Update renderables": {
    "average time": 0.1988377572034353,
    "best time": 0.0003510859220941582,
    "count": 649,
    "success rate": 100,
    "worst time": 12.8709652214104
  },
  "Before render": {
    "average time": 0.5206290903024032,
    "best time": 0.01522995241633128,
    "count": 188,
    "success rate": 100,
    "worst time": 81.06473259514415
  },
  "Rendering": {
    "average time": 4.425231035278629,
    "best time": 0.4979532268296139,
    "count": 214,
    "success rate": 100,
    "worst time": 71.34537426614806
  },
  "After render": {
    "average time": 0.06479598048728916,
    "best time": 0.0301288189105684,
    "count": 563,
    "success rate": 100,
    "worst time": 0.6413134310963844
  }
}

我想計算每個 json object 中所有平均值的平均值我如何遍歷 json 對象?

我正在嘗試將所有平均值加起來並計算它們的平均值

編輯:

我有這個 for 循環,我想遍歷每個 object (而不是獲取其成員名稱,而是實際遍歷對象並獲取值,然后將它們相加):

for(int i=0; i<json.size(); i++){
            sumAllAverages(json.getAsJsonObject());
        }

private static void sumAllAverages(JsonObject asJsonObject) {
        sum += Float.parseFloat(asJsonObject.get("average time").toString());
    }

使用 GSON 您可以將其反序列化為 map,例如:

Type type = new TypeToken<Map<String, Map<String, Double>>>() {}.getType();
Map<String, Map<String, Double>> map =
        new Gson().fromJson(getResourceStreamReader("file.json"), type);

getResourceStreamReader("file.json")只是從資源文件中獲取 JSON 的輔助方法。 它可以是字符串或任何閱讀器。

擁有所有平均時間(例如):

Set<Double> averageTimes = map.values().stream()
    .map(v -> v.get("average time")).collect(Collectors.toSet());

要檢查此 map 的平均值,您可以執行以下操作:

averageTimes.forEach(averageTime -> System.out.println(averageTime));

這會產生:

0.01610115085649609
0.1988377572034353
0.5206290903024032
4.425231035278629
0.06479598048728916

此外,您可以使用 reduce 對所有值求和並獲得總平均時間;

Double totalAverageTime = averageTimes.stream()
            .reduce((a, b) -> a + b).orElse(0D) / averageTimes.size();

檢查它:

System.out.println(totalAverageTime);

你會看到:

1.0451190028256505

注意:即使在一個 lambda 中,所有這些計算也可以用更少的行來完成,但為了清楚起見並更容易理解,我已經拆分了各個階段。

這就是我在 Jackson 中的做法,gson 應該非常相似。

JsonNode time_Data;
    try {
      time_Data = new ObjectMapper().readTree(jsonTimes); // **this is your file as a string
      double sum = 0.0;
      if(time_Data!= null) {
        for (final JsonNode valuesPacket : time_Data) {
          sum += Double.parseDouble(valuesPacket.get("average time").asText());
        }
      }
      System.out.println("sum is :"+sum);
    } catch (JsonProcessingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM