使用以下方法,我可以获得“ 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*",
答案 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")