放心地在对象数组中查找特定的键值对

时间:2019-04-09 08:17:06

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

我有一个类似这样的json响应:

private void dataGridView1_DataBindingComplete(object sender DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (Convert.ToInt32(row.Cells["balaceAmount"].Value) == 0)
        {
            row.DefaultCellStyle.BackColor = Color.Yellow;
        }
        else
        {
            row.DefaultCellStyle.BackColor = Color.White;
        }
    }
}

我想检查someArray数组是否具有名称为“ someProperty”且值为“ someValue”的对象,但如果它具有具有相同属性但值不同的另一个对象,则不要失败。

有可能吗?在此之前,我一直使用静态索引,因为该数组中只有一个元素。

2 个答案:

答案 0 :(得分:2)

这是使用JsonPath的解决方案:

List<String> values = RestAssured.when().get("/api")
    .then().extract().jsonPath()
    .getList("someArray.someProperty");

Assert.assertTrue(values.contains("someValue"));

将适用于以下响应JSON:

{  
   "someArray":[  
      {  
         "someProperty":"someValue"
      },
      {  
         "someProperty":"someOtherValue"
      }
   ]
}

答案 1 :(得分:0)

假设您使用的是Java 8或更高版本,则应使用Arrays.stream(someArray),然后使用filter方法来选择所需的元素。

我没有使用过REST保证,但是根据他们的文档,看来您应该可以在下面使用类似的东西

@Test public void
lotto_resource_returns_200_with_expected_id_and_winners() {

    when().
            get("/lotto/{id}", 5).
    then().
            statusCode(200).
            body("someArray", hasItems(hasEntry("someProperty", "someValue")));

}

如果您可以在使用hasEntry之前放一些反序列化逻辑将对象转换为映射,则此方法有效

另一种解决方案是使用findAll body("someArray.findAll {o -> o.someProperty == 'someValue'}.size()", greaterThan(0))