如何使用Groovy使用变量从JSON响应中提取值?

如何使用Groovy使用变量从JSON响应中提取值?,json,groovy,soapui,assertion,jsonslurper,Json,Groovy,Soapui,Assertion,Jsonslurper,我试图通过使用存储在变量“jsonFieldName”中的值的位置,从JSON响应中提取自行车品牌“Cannondale” 或者,我可以使用以下语法成功提取品牌价值: def brand = json.store.bicycle.brand 但是,我希望将元素的位置保留在变量中。原因是,我希望能够在Json响应上迭代多个断言,作为自动化套件的一部分 有人能告诉我怎么做吗 下面是我目前在一个变量中存储位置的代码片段。但它不起作用,并且总是将品牌返回为“Null”:( 谢谢 问题是使用字符串访问属

我试图通过使用存储在变量“jsonFieldName”中的值的位置,从JSON响应中提取自行车品牌“Cannondale”

或者,我可以使用以下语法成功提取品牌价值:

def brand = json.store.bicycle.brand
但是,我希望将元素的位置保留在变量中。原因是,我希望能够在Json响应上迭代多个断言,作为自动化套件的一部分

有人能告诉我怎么做吗

下面是我目前在一个变量中存储位置的代码片段。但它不起作用,并且总是将品牌返回为“Null”:( 谢谢


问题是使用字符串访问属性;字符串被视为属性的全名,因此不能使用它访问多个深度属性;换句话说,
被视为属性名称的一部分

一种可能的解决方法是按
字符分割字符串,然后逐个访问属性:

def jsonFieldName = "store.bicycle.brand"
def json = new JsonSlurper().parseText (response)

jsonFieldName.split("\\.").each{json = json[it]}

assert json == 'Cannondale'
new JsonSlurper().parseText(response)
返回一个,因此,搜索
“store.bicycle.brand”
将在
json
变量中查找名为
store.bicycle.brand
的键,而您希望首先查找
json['store']
,然后查找索引
['bicycle']
,依此类推

我使用了
inject
策略来实现您想要的:

def response = '''{
   "store": {
  "bicycle": {
     "brand": "Cannondale",
     "color": "red",
     "price": 19.95
  }
 }
}'''

def jsonFieldName = "store.bicycle.brand"
def json = new groovy.json.JsonSlurper().parseText (response)

get = { field, json2 ->
    field.tokenize(".").inject(json2) { map, f -> map[f] }
}

brand = get jsonFieldName, json
assert brand == 'Cannondale'

实际上,一个更实用的方法会让你的答案更漂亮,+1!
def response = '''{
   "store": {
  "bicycle": {
     "brand": "Cannondale",
     "color": "red",
     "price": 19.95
  }
 }
}'''

def jsonFieldName = "store.bicycle.brand"
def json = new groovy.json.JsonSlurper().parseText (response)

get = { field, json2 ->
    field.tokenize(".").inject(json2) { map, f -> map[f] }
}

brand = get jsonFieldName, json
assert brand == 'Cannondale'