【问题标题】:Is there a way to find a JSON response element value based on another element value?有没有办法根据另一个元素值查找 JSON 响应元素值?
【发布时间】:2019-07-01 09:12:01
【问题描述】:

使用下面的方法,我可以获得“id”元素(第一个列表中的第一个元素)值。我需要获取该元素值,但基于另一个元素“gifts.nameEn”的条件

Response response = request.post("/pop/transaction/inquiry");
JsonPath jsonPathEvaluator = response.jsonPath();

List<HashMap> activeCampaignsList = jsonPathEvaluator.getList("");
for(int i=0; i< activeCampaignsList.size(); i++)
{
        offerId = activeCampaignsList.get(i).get("id").toString();
        break;
}

这里是响应 sn-p,所以你会知道我到底在寻找什么:

[ { "**id**": 1222, "type": "WITHIN_TRANSACTION", "gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "*abcd201957261140057*",

【问题讨论】:

  • “基于另一个元素值”是什么意思?你想完成什么?
  • 我得到的响应有多个“礼物”,每个都有“id”我需要获取“id”的值对于那个特定的“gifts.nameEn”注释,我已经有了“gifts.nameEn”的值,我无法在请求中发送它
  • @TareqShams 查看我的答案。我能够根据gifts.nameEn 获得 ID
  • @Fenio 它就像一个魅力,我接受了你的回答,再次感谢:)

标签: java json rest-assured rest-assured-jsonpath


【解决方案1】:

RestAssured 允许您使用JsonPath,它在 JSON 处理中具有强大的实用性。您可以将 JSON 转换为 Java 对象,而不是使用路径,我将向您展示具体操作方法。

因此,您的 JSON 以一组元素开始。每个元素都是 JSON 对象。每个 JSON 对象都包含嵌套的 JSON 数组 gifts,其中包含 JSON 对象。让我进一步解释。

我们必须首先处理数组,即 JSON [ 的开头。为了做到这一点,我们可以像这样创建一个表示这个数组的类:

public class ElementObject { //this name is irrelevant. You can call it whatever you want
    public String id; //the names of the variables are relevant
    public String type; //each of variable name corresponds to the type and name in the JSON
    public List<GiftObject> gifts; //here we handle the nested JSON Array of JSON Objects
}

现在,我们需要一个对象来处理gifts。这将需要另一个类:

public class GiftObject { //irrelevant name
    public String startDate; //relevant name
    public String endDate;
    public String id;
    public String nameAr;
    public String nameEn;
}

现在,我们所要做的就是从JsonPath 调用1 个方法来将整个JSON 解析为Java 类。像这样:

response.jsonPath().getObject("", ElementObject[].class);

主要是这样。从顶部开始:

[  
   {  
      "id":1222,
      "type":"WITHIN_TRANSACTION",

我们有一个带有 JSON 对象的 JSON 数组。 1 个 JSON 对象等于 ElementObject 类的 1 个实例。 Array 中的所有对象都将被解析为ElementObject[].class,JsonPath 将使用Java Reflection 创建一个实例(您不必担心)。

"gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "abcd201957261140057",

每个礼物都会被解析成GiftObject 的新实例并存储在ElementObject 类中的List&lt;GiftObject&gt; 中。

我们现在要做的就是处理我们的 Java 类。

要完整回答您的问题 - 您需要基于 gifts.nameEn 的 ID 值

for (ElementObject element : elements) {
            for (GiftObject gift : element.gifts) {
                if (gift.nameEn.equals("abcd201957261140057")) {
                    System.out.println(element.id);
                }
            }
        }

上面的for 循环可以很容易地用方法或Java Streams 替换。最适合你的。

根据上面的代码,结果将是:

1222

希望对你有帮助!

编辑: 如果您因为在类路径中未找到 JSON 反序列化程序而收到类似无法反序列化对象的异常。请将 Jackson (Databind) 或 Gson 放在类路径中。您所要做的就是将jackson-databind 添加到Maven。 Rest Assured 能够使用 Gson 或 Jackson 数据绑定将 JSON 转换为 Java 类。您所需要的只是依赖关系,一切就绪。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>

【讨论】:

  • @TareqShams 请接受我的回答 :) 见how
猜你喜欢
  • 1970-01-01
  • 2020-06-11
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多