有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用gson java解析和获取嵌套json对象

我有一个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对象中所有平均值的平均值,如何迭代json对象

我试图把所有的平均值加起来,计算出它们的平均值

编辑:

我有一个for循环,我想遍历每个对象(不是得到它的成员名,而是遍历对象,得到值,然后求和):

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

共 (2) 个答案

  1. # 1 楼答案

    这就是我在杰克逊的做法,格森应该相当类似

    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();
        }
      }
    
  2. # 2 楼答案

    使用GSON,您可以将其反序列化为以下映射:

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

    例如,要检查此地图的平均值,可以执行以下操作:

    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

    注意:即使在一个λ中,所有这些计算都可以用更少的线来完成,但为了清晰和更容易理解,我已将相位分割