Json if语句未通过-groovy脚本

Json if语句未通过-groovy脚本,json,groovy,soapui,Json,Groovy,Soapui,我有一个通过特殊条件的问题。我正在显示一个json中的值,正如您从屏幕截图中看到的,它在日志中显示值2210,但是它输出条件为失败,而它应该为真。我看不出它为什么会失败,有人知道为什么或者我可以尝试什么来修复它,使它通过吗 代码如下: import groovy.json.JsonSlurper def response = messageExchange.response.responseContent def json = new JsonSlurper().parseText(resp

我有一个通过特殊条件的问题。我正在显示一个json中的值,正如您从屏幕截图中看到的,它在日志中显示值2210,但是它输出条件为
失败
,而它应该为
。我看不出它为什么会失败,有人知道为什么或者我可以尝试什么来修复它,使它通过吗

代码如下:

import groovy.json.JsonSlurper
def response = messageExchange.response.responseContent
def json =  new JsonSlurper().parseText(response)
def hotelidjson = json.jet2_hotel_id
hotelid = context.expand( '${#TestCase#hotelid}' )


assert hotelidjson != null

if (hotelidjson == "2210")
    log.info "pass"
else
    log.info "fail"


log.info hotelidjson
更新:

响应字符串输出:

INFO:[{jet2Awards=[], awards=[{awardType=Certificate of Excellence, images={small=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg, large=https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg}, year=2016}], num_reviews=342, rating_image_url=https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png, jet2_hotel_id=2210, rating=4.5}]
响应的json如下所示:

[{
   "rating": "4.5",
   "rating_image_url": "https://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.5-24283-5.png",
   "num_reviews": 342,
   "jet2_hotel_id": 2210,
   "awards": [   {
      "awardType": "Certificate of Excellence",
      "year": "2016",
      "images":       {
         "small": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_small-24283-5.jpg",
         "large": "https://www.tripadvisor.com/img/cdsi/img2/awards/CERTIFICATE_OF_EXCELLENCE_2016_en_US_large-24283-5.jpg"
      }
   }], 
谢谢你

你正在测试
“2210”
但是
hotelidjson.toString()
“[2210]”
,所以对象肯定不是字符串
“2210”

它实际上是什么,很难说。对于程序员来说,这是一个普遍的问题,“
println()
说他们是一样的,但是
assertEquals()
说他们“不在IDE”。但是考虑一个<代码>列表包含<代码>“hello”<代码>打印为<代码> [ [ hello ] ] /<代码>和“字符串<代码>”(\“hello”)也打印为<代码> [你好] > <代码> < /p> 此外,此类的对象打印为
[“Hello”]

因此,在假设提供相同
println()
输出的两个对象实际上相等之前,您需要更彻底一点

最明智的做法是在调试器中运行测试。在断言之前放置一个断点,然后在该点检查变量

一个更简单的选择是添加更多的诊断日志记录,但如果您还不是习惯性的调试器用户,则安装开销会更小。例如,
log.info hotelidjson.getClass()

然而,我完全建议养成使用调试器的习惯。它很快就会用节省下来的时间来回报你的努力


更新,现在您已经显示了JSON。我希望
hotelidjson==2210
通过
2210
“2210”
不相等,因为一个是数字,另一个是字符串

(我注意到你在评论中发现了它是一个列表。我不知道为什么。)

你正在测试
“2210”
,但是
hotelidjson.toString()
“[2210]”
所以对象肯定不是字符串
“2210”

它实际上是什么,很难说。对于程序员来说,这是一个普遍的问题,“
println()
说他们是一样的,但是
assertEquals()
说他们“不在IDE”。但是考虑一个<代码>列表包含<代码>“hello”<代码>打印为<代码> [ [ hello ] ] /<代码>和“字符串<代码>”(\“hello”)也打印为<代码> [你好] > <代码> < /p> 此外,此类的对象打印为
[“Hello”]

因此,在假设提供相同
println()
输出的两个对象实际上相等之前,您需要更彻底一点

最明智的做法是在调试器中运行测试。在断言之前放置一个断点,然后在该点检查变量

一个更简单的选择是添加更多的诊断日志记录,但如果您还不是习惯性的调试器用户,则安装开销会更小。例如,
log.info hotelidjson.getClass()

然而,我完全建议养成使用调试器的习惯。它很快就会用节省下来的时间来回报你的努力


更新,现在您已经显示了JSON。我希望
hotelidjson==2210
通过
2210
“2210”
不相等,因为一个是数字,另一个是字符串


(我注意到你在评论中发现它是一个列表。我不知道为什么。)

因为
hotelidjson
实际上是一个列表而不是字符串(
[2210]
是列表的字符串表示形式),所以直接将其与字符串进行比较总是返回false。你可以做:

if (hotelidjson == [2210])

应该小心地使用def


PS:谢谢斯利姆的提示;)

由于
hotelidjson
实际上是一个列表,而不是一个字符串(
[2210]
是列表的字符串表示形式),因此直接将其与字符串进行比较总是返回false。你可以做:

if (hotelidjson == [2210])

应该小心地使用def


PS:谢谢斯利姆的提示;)

但是
hotelidjson
[2210]
不是
2210
。。。是否要检查字符串是否等于该值或包含该值?此外,日志与代码不一致,因为有3个值,但只有2个失败。提供的代码不可能出现这种情况。(1)请不要对代码或输出的截图提出疑问。改为复制/粘贴文本。它更容易阅读和使用。(2) 注释掉的代码与您的问题无关,因此请不要包含它。(3)显示字符串
response
(删除不相关的元素)@m0skit0的值,即使我更改if条件以检查hoteldidjson=[2210]是否失败。。对于日志,我运行了它,它显示了一个3的日志,然后我注释掉了其中一个日志,但没有清除它,因此为什么在应该是2的时候看到5个日志,你能告诉我们hotelidjson是什么吗
log.info hotelidjson.class
但是
hotelidjson
[2210]
不是
2210
。。。是否要检查字符串是否等于该值或包含该值?此外,日志与代码不一致,因为有3个值,但只有2个失败。提供的代码不可能出现这种情况。(1)请不要对代码或输出的截图提出疑问。改为复制/粘贴文本。它更容易阅读和使用。(2) 注释掉的代码与您的问题无关,因此请不要包含它。(3)显示字符串
response
(删除不相关的元素)@m0skit0的值,即使我更改if条件以检查hoteldidjson=[2210]是否失败。。F
if (hotelidjson[0] == 2210)