将groovy变量作为JSON路径的一部分引用

时间:2015-05-10 23:41:01

标签: json groovy

我在Ready API测试用例中使用groovy脚本来验证json Web服务响应中的结果。

我想使用一个变量(在数据源中指定)来指定我想要验证的json路径,因为这可能会在每次测试运行时发生变化。

以下代码正确地将路径results.address_components.long_name引用的所有数据分配给变量' actualResponseOne'

def actualResponseOne =  jsonSlurper.results.address_components.long_name.collect()

但是,因为在同一个测试中我可能想要验证不同的json元素,即。 results.geometry.location_type例如我不希望在groovy脚本中对路径进行硬编码,而是将其设置在数据源中并将其分配给我脚本中的groovy变量..

def testElementOne1   = context.expand( '${DataSource-Groovy-GoogleMaps#testElement1}' );

如何在代码中引用此json路径,将数据分配给' actualResponseOne'?以下代码无效。

def actualResponseOne =  jsonSlurper.${testElementOne}.collect()

非常感谢任何帮助。

的问候,

担。

2 个答案:

答案 0 :(得分:0)

我理解的方式是GPath不会遍历点[见this stack overflow questionthis Grovy language bug]。您可能必须打破Eval类以强制进行评估。也许是这样的?

ourPath = "results.address_components.long_name" Eval.x( ourPath, "jsonSlurper.${x}.collect()" )

答案 1 :(得分:0)

使用Eval的另一种方法是添加一个帮助方法来拆分路径并迭代遍历它:

class Nested {
    static class A {
        B b
    }
    static class B {
        C c
    }
    static class C {
        List list
    }
    static void main(String[] args) {
        def a = new A(b: new B(c: new C(list: [1, 2, 3])))
        println getNestedProperty(a, "b.c.list").collect { String.format "%03d", it }
    }

    static def getNestedProperty(def object, String path) {
        path.split(/\./).each {
            object = object."${it}"
        }
        return object
    }
}
  

[001,002,003]