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