有没有一种方法可以根据另一个元素值查找JSON响应元素值?

时间:2019-07-01 09:12:01

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

使用以下方法,我可以获得“ 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;
}

这是响应代码段,因此您会知道我正在寻找什么:

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

2 个答案:

答案 0 :(得分:0)

RestAssured允许您使用JsonPath,它在JSON处理中具有强大的实用性。除了使用路径,您还可以将JSON转换为Java对象,我将向您确切演示如何实现。

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

我们必须首先处理数组,即JSON [的开头。为此,我们可以创建一个表示此Array的类,如下所示:

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个实例。数组中的所有对象都将解析为ElementObject[].class,JsonPath将使用Java Reflection创建一个实例(您不必为此担心)。

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

每个礼物都会被解析成GiftObject的新实例,并存储在List<GiftObject>类的ElementObject中。

我们现在要做的就是在我们的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>

答案 1 :(得分:0)

假设您有以下json作为响应:

[  
   {  
      "**id**":1222,
      "type":"WITHIN_TRANSACTION",
      "gifts":[  
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":12345,
            "nameAr":"abcd201957261140057",
            "nameEn":"xyzd201957261140057"
         },
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":54321,
            "nameAr":"abcd201957261140057",
            "nameEn":"qwed20333361140057"
         },
         {  
            "startDate":"2019-06-26",
            "endDate":"2019-06-26",
            "id":26135,
            "nameAr":"abcd201957261140057",
            "nameEn":"abcd20195724447"
         }
      ]
   }
]

要获取具有“ nameEn”:“ abcd20195724447” 的对象的 id ,您可以执行以下操作:

Response response = request.post("/pop/transaction/inquiry");
JsonPath jsonPathEvaluator = response.jsonPath();
jsonPathEvaluator.getInt("[0].gifts.find { it.nameEn == 'abcd20195724447' }.id")