如何使用Groovy脚本查找json响应中是否存在属性名称

时间:2016-04-22 19:08:08

标签: json groovy soapui

我正在尝试在soapui中使用Groovy脚本作为我的Json响应,并查找我的响应中是否存在该属性。我用If语句如下。对于我用来检查它的属性名称,即使属性不存在,也只返回true语句。我不确定我在这里做错了什么。

import groovy.json.JsonSlurper

def slurper = new JsonSlurper()
def i = 0

responseContent = testRunner.testCase.getTestStepByName("DAY").getPropertyValue("response")
slurperresponse = new JsonSlurper().parseText(responseContent)

if(slurperresponse.day_details.activities.to_locans) {
     println "************************"
     res = "Crew_base found" 
} else {
     res = "Crew_base not found"
}

1 个答案:

答案 0 :(得分:1)

这是由一些事情聚集在一起造成的:

  1. Groovy为未知密钥返回null
  2. Groovy允许您使用xpath类型变量查找,包括是否通过嵌套列表
  3. 列表中的Groovy truthy基于列表大小 - 即使列表只包含null,如果它不为空,那么它的计算结果为true。
  4. 上面的评论显示了问题:

    有效的属性名称

    Fri Apr 22 16:01:19 EDT 2016:INFO:<java.util.ArrayList@260080 elementData=[[NYP, NYP]] size=1 modCount=1> 
    

    对于无效的属性名称

    Fri Apr 22 16:01:35 EDT 2016:INFO:<java.util.ArrayList@3e0 elementData=[[null, null]] size=1 modCount=1> 
    

    在两种情况下,您都会看到结果是两个项目的列表(列表) - 所以总是评估为真。

    作为地图,从您打印该变量转储的最终评论中,它看起来像这样:

    [
            day_details: [
                [
                    fra_status:'', block_training_day:0, holiday_name:'', activities:[
                        [ from_location:'WAS', craft:'Conductor', departure_datetime:'2016-04-26T13:02:00-04:00', end_datetime:'2016-04-26T16:30:00-04:00', crew_base:'NYP', ends_next_day:false, description:'Unit', train_number:172, to_location:'NYP', arrival_datetime:'2016-04-26T16:30:00-04:00', zone:'Zone 2', start_datetime:'2016-04-26T12:52:00-04:00' ], 
                        [ from_location:'NYP', craft:'Engineer', to_location:'WAS', zone:'Zone 2', start_datetime:'2016-04-26T17:55:00-04:00' ]
                    ]
                ]
            ]
        ]
    

    阅读它,您会看到day_detailsactivities都是嵌套列表(因此响应中的两个列表 - 所以groovy导航到activities内的每个地图并查看对于键to_locans - 没有找到键,它返回null,并将这两个空值放入列表中。

    将if检查更改为以下内容将按照您的预期工作(假设您只想考虑每个列表中的第一个元素):

    if (slurperresponse.day_details[0].activities[0].to_locans){