有没有办法根据另一个元素值找到 JSON 响应元素值?
Is there a way to find a JSON response element value based on another element value?
使用下面的方法我可以获得“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*",
RestAssured
允许您使用 JsonPath
,它在 JSON 处理中具有强大的实用性。您可以将 JSON 对象转换为 Java 对象,而不是使用路径,我将向您展示具体操作方法。
因此,您的 JSON 以元素数组开头。每个元素都是 JSON 对象。每个 JSON 对象都包含嵌套的 JSON 数组 gifts
,其中包含 JSON 个对象。让我进一步解释。
我们必须先处理数组,您的 JSON [
的开始。为了做到这一点,我们可以创建一个 class 来表示这个数组,如下所示:
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
。这将需要另一个 class:
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 classes。像这样:
response.jsonPath().getObject("", ElementObject[].class);
差不多就是这些了。从顶部开始:
[
{
"id":1222,
"type":"WITHIN_TRANSACTION",
我们有一个包含 JSON 个对象的 JSON 数组。 1 JSON 对象等于 ElementObject
class 的 1 个实例。 Array 中的所有对象都将被解析为 ElementObject[].class
并且 JsonPath 将使用 Java Reflection
创建一个实例(您不必担心)。
"gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "abcd201957261140057",
每个礼物都将被解析为 GiftObject
的新实例并存储在 ElementObject
class 中的 List<GiftObject>
class.
我们现在要做的就是在 Java classes 上工作。
要完整回答您的问题 - 您需要基于 gifts.nameEn
的 ID 值
for (ElementObject element : elements) {
for (GiftObject gift : element.gifts) {
if (gift.nameEn.equals("abcd201957261140057")) {
System.out.println(element.id);
}
}
}
上面的 for
循环可以很容易地用方法或 Java 流替换。最适合你的。
给定以上代码,结果将是:
1222
希望对您有所帮助!
编辑:
如果你得到这样的异常 Cannot deserialize object because no JSON deserializer found in classpath。请将 Jackson(Databind)或 Gson 放在 class 路径中。您所要做的就是将 jackson-databind 添加到 Maven。 Rest Assured 能够使用 Gson 或 Jackson databind 将 JSON 转换为 Java classes。您只需要依赖项,一切就绪。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
使用下面的方法我可以获得“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*",
RestAssured
允许您使用 JsonPath
,它在 JSON 处理中具有强大的实用性。您可以将 JSON 对象转换为 Java 对象,而不是使用路径,我将向您展示具体操作方法。
因此,您的 JSON 以元素数组开头。每个元素都是 JSON 对象。每个 JSON 对象都包含嵌套的 JSON 数组 gifts
,其中包含 JSON 个对象。让我进一步解释。
我们必须先处理数组,您的 JSON [
的开始。为了做到这一点,我们可以创建一个 class 来表示这个数组,如下所示:
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
。这将需要另一个 class:
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 classes。像这样:
response.jsonPath().getObject("", ElementObject[].class);
差不多就是这些了。从顶部开始:
[
{
"id":1222,
"type":"WITHIN_TRANSACTION",
我们有一个包含 JSON 个对象的 JSON 数组。 1 JSON 对象等于 ElementObject
class 的 1 个实例。 Array 中的所有对象都将被解析为 ElementObject[].class
并且 JsonPath 将使用 Java Reflection
创建一个实例(您不必担心)。
"gifts": [ { "startDate": "2019-06-26", "endDate": "2019-06-26", "id": 26130, "nameAr": "abcd201957261140057", "nameEn": "abcd201957261140057",
每个礼物都将被解析为 GiftObject
的新实例并存储在 ElementObject
class 中的 List<GiftObject>
class.
我们现在要做的就是在 Java classes 上工作。
要完整回答您的问题 - 您需要基于 gifts.nameEn
for (ElementObject element : elements) {
for (GiftObject gift : element.gifts) {
if (gift.nameEn.equals("abcd201957261140057")) {
System.out.println(element.id);
}
}
}
上面的 for
循环可以很容易地用方法或 Java 流替换。最适合你的。
给定以上代码,结果将是:
1222
希望对您有所帮助!
编辑: 如果你得到这样的异常 Cannot deserialize object because no JSON deserializer found in classpath。请将 Jackson(Databind)或 Gson 放在 class 路径中。您所要做的就是将 jackson-databind 添加到 Maven。 Rest Assured 能够使用 Gson 或 Jackson databind 将 JSON 转换为 Java classes。您只需要依赖项,一切就绪。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>