当前位置: 首页 > 知识库问答 >
问题:

如何使用JSON对象上的restassured中的gpath sum()获得值的总和

姬昀
2023-03-14

我试图从以下 JSON 响应的 JSON 对象提取中找到已故计数的总和

https://api.covid19india.org/state_district_wise.json

上面的片段是json

"Maharashtra": {
    "districtData": {
      "Ahmednagar": {
        "notes": "",
        "active": 4206,
        "confirmed": 275516,
        "migratedother": 1,
        "deceased": 5565,
        "recovered": 265744,
        "delta": {
          "confirmed": 559,
          "deceased": 4,
          "recovered": 0
        }
      },

我想找到马哈拉施特拉邦死者的总数。我知道我们可以在JSONArray上使用collect,但这里是JSONObject。我试着跟随,但没有成功

int value=jsonPath.get("Maharashtra.districtData.collect{it.deceased}.sum()");

共有1个答案

麻茂材
2023-03-14

对象中有2个已死亡的键,我假设您只需要外部对象中的已死亡键。到目前为止我得到的最简单的解决方案。

@Test
void name3() {
    Response res = RestAssured.given()
            .get("https://api.covid19india.org/state_district_wise.json");
    Map<String, ?> data = res.jsonPath().getMap("Maharashtra.districtData");
    Set<String> keys = data.keySet();
    int sum = keys.stream()
            .mapToInt(key ->
               JsonPath.read(res.asString(), String.format("$.Maharashtra.districtData.[\"%s\"].deceased", key)))
            .sum();
    System.out.println(sum); //126851
}

万一你不想用Java8流。

int sum = 0;
for (String key : keys) {
    int deceased = JsonPath.read(res.asString(), String.format("$.Maharashtra.districtData.[\"%s\"].deceased", key));
    sum += deceased;
}

我使用JSON path(com . jayway . JSON path . JSON path)

pom.xml

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.6.0</version>
</dependency>

使现代化

我想出了另一个解决方案,即使用映射POJO。

@Test
void name4() {
    Response res = RestAssured.given()
            .get("https://api.covid19india.org/state_district_wise.json");

    Configuration configuration = Configuration.builder()
            .jsonProvider(new JacksonJsonProvider())
            .mappingProvider(new JacksonMappingProvider())
            .build();

    List<DistrictData> data = JsonPath.using(configuration).parse(res.asString())
            .read("$.Maharashtra.districtData.*", new TypeRef<>() {});

    int sum = data.stream().mapToInt(DistrictData::getDeceased).sum();
    System.out.println(sum); //126851
}

波霍

import lombok.Data;
import java.util.Map;

@Data
public class DistrictData {
    private String notes;
    private int active;
    private int confirmed;
    private int migratedother;
    private int deceased;
    private int recovered;
    private Map<String, Object> delta;
}
 类似资料:
  • 我试图从json文件中获取一个对象数组,但遇到了一个问题。 我应该使用什么路径来获取项目中的所有项目(item0、item1、item2…)? 你能给我一个怎么做的建议吗。 Json 示例 从items对象中过滤item的最佳方法,但我不知道如何使用json路径。

  • 问题内容: 我有一个与此对象类似的对象: 我试图得到它的长度,问题是返回5而不是3(这是它的总项目数)。该数组相对较长(有1000x2000个项目),并且必须每秒执行很多次。我如何才能更有效地获取商品数量? 问题答案: 显然,除了kieran的回答外,现代浏览器还具有功能。在这种情况下,您可以这样做:

  • 问题内容: 这是我要在这里实现的目标: 从数据库获取文件名和ID的列表 在网络路径上搜索这些文件 存储未找到的文件的任何ID 在第二个数据库中搜索该ID 在网络路径上搜索这些文件 列出所有在两个位置均未找到文件的ID。 我遇到的问题是尝试使用我收集的结果中的文件名。 运行代码时,会显示从数据库收集的原始JSON数据,但是当尝试仅列出文件名时,我什么也没得到(甚至没有错误) 关于如何解决此问题并以一

  • 问题内容: 我使用以下代码在Android中使用Gson比较了两个JSON对象: 有两种方法可以使用Gson以JSON格式获取两个对象之间的 差异 吗? 问题答案: 如果将对象反序列化为,则也可以使用Guava,可以用来比较两个生成的地图。 请注意,如果您关心元素的 顺序 ,则不会保留s 字段的顺序,因此此方法不会显示这些比较。 这是您的操作方式: 该程序输出: 在此处阅读更多有关结果对象包含的信

  • 问题内容: 我使用以下代码在Android中使用Gson比较了两个JSON对象: 有两种方法可以使用Gson以JSON格式获取两个对象之间的 差异 吗? 问题答案: 如果将对象反序列化为,也可以使用Guava,则可以用来比较两个生成的地图。 请注意,如果您关心元素的 顺序 ,则不会保留s 字段的顺序,因此此方法不会显示这些比较。 这是您的操作方式: 该程序输出: 在此处阅读更多有关结果对象包含哪些

  • 问题内容: 我正在struts上从事Web服务。现在我想要json对象使用其键值。然后,我必须发布类似数组的内容作为响应。我不知道如何在Struts中做到这一点。我知道如何在Servlet中执行此操作。因此,我使用的是我尝试过的以下代码,但我认为Struts中的代码有所不同。 因此,如何在Struts中做到这一点。还请告诉我如何解析json数组作为响应。 问题答案: 使用JSON无需将JSON发送