使用jsonPath匹配布尔真值

问题描述 投票:0回答:2

我正在尝试编写一个 JUnit 测试,它检查接收到的 JSON 的值。我使用 jsonPath 访问 JSON 中的这些值。我想检查一个值是否为

true
。对于简单的 jsonPaths,它对我有用,但是当我编写更复杂的 jsonPath 查询时,它不起作用,并且我收到此断言错误:

Expected: is <true>
but: was <[true]>

我的JSON:

{...
,"trips":
  [
    {...
    ,"employee":{"name":"Ordinary Joe","login":"joe","contractor":true}
    ,...
    },
    ...
  ],
 ...
}

有问题的断言

.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", is(true)));

我尝试过的

我尝试将该值也与

new Boolean(true)
boolean[]
数组与一个
true
值进行匹配,并且在检查
is()
匹配器后也与
String.valueOf(true)
但它也不匹配。

我的问题

我应该如何正确匹配这个

true
值?这些
[]
大括号在测试输出中到底意味着什么?

java json junit jsonpath hamcrest
2个回答
3
投票

在进一步的调查中,我实际上发现 jsonPath 以某种方式将获得的

true
值转换为具有一项的
JsonArray
,因此不可能将其与
is(true)
匹配器匹配。我不知道为什么 JsonPath 这样做。

我发现使用

hasItem
匹配器代替以下工作解决方法:

.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", hasItem(true)))
.andExpect(jsonPath("$.trips[?(@.employee.login=='joe')].employee.contractor", not(hasItem(false))))

0
投票

您可以使用 ==0 表示 true 或 ==1 表示 false

{
  MyArray: [
    {
      IsTrueOrFalse: true,
      Item: "1st Item"
    },
    {
      IsTrueOrFalse: false,
      Item: "2nd Item"
    }
  ]
}

$..MyArray[?(@.CheckIfTrueOrFalse==0)].Item 返回 [“第一项”]

© www.soinside.com 2019 - 2024. All rights reserved.