Я не уверен, что я действительно понимаю ситуацию, то кажется, что вы получаете в XML ответ, который имеет JSON в атрибуте узла ... не так ли?
Несмотря на это, что я понимаю, в основном, что вы хотите, чтобы убедиться, что все endpoints
записи в вашем JSON содержит все обязательные атрибуты: label
, branch
, appname
; и все branches
в каждой конечной точке содержит url
, name
, api_version
и label
.
Таким образом, можно использовать JsonSlurper
и проверить, нет ли элемента null
. Что-то вроде:
import groovy.json.JsonSlurper
def jsonTxt = '''{
"timestamp": "2016-04-14T17:53:29Z",
"id": "544cc493-8f4a-4f14-b95b-2c127f54caac",
"endpoints": [
{
"label": "Gify",
"branches": [
{
"url": "/gify/v1.0/",
"name": "test",
"api_version": "1.0",
"label": "test"
}
],
"appname": "gify"
},
{
"label": "x1",
"branches": [
{
"url": "/x1/v1.0/",
"name": "test",
"api_version": "1.0",
"label": "test"
}
],
"appname": "gify2"
}
]
}'''
// parse json
def json = new JsonSlurper().parseText(jsonTxt)
// for each endpoint
json.endpoints.each { endpoint ->
// check that label is not null
assert endpoint.label != null, 'ENDPOINT ENTRY NOT CONTAINS LABEL'
// check that appname is not null
assert endpoint.appname != null, 'ENDPOINT ENTRY NOT CONTAINS APPNAME'
// ...
assert endpoint.branches != null, 'ENDPOINT ENTRY NOT CONTAINS BRACHES'
// for each branch
assert endpoint.branches.each { branch ->
// and so on...
assert branch.url != null, 'BRANCH ENTRY NOT CONTAINS URL'
assert branch.name != null, 'BRANCH ENTRY NOT CONTAINS NAME'
assert branch.api_version != null, 'BRANCH ENTRY NOT CONTAINS API_VERSION'
assert branch.label != null, 'BRANCH ENTRY NOT CONTAINS LABEL'
}
}
UPDATE
Вряд XML и XSD, нет схемы для проверки против вашего Json, однако вы можете создать шаблон для подтверждения вашего ответа против использования JsonSlurper
. Так как вы только хотите, чтобы проверить на name
с элементов не его значение вы можете создать функцию для сравнения name
s рекурсивно:
import groovy.json.JsonSlurper
// compare json against the "schema"
def compareJsonNames(json,schema) {
if(json instanceof Map){
// it's a map... check all names
assert(json.keySet() == schema.keySet())
// for every element in a map...
json.eachWithIndex { it,index ->
def key = schema.keySet().getAt(index)
return compareJsonNames(it.value, schema.find{ e -> e.key == key}.value)
}
}else if(json instanceof List){
// it's a list, compare its elements
json.eachWithIndex { it, index ->
return compareJsonNames(it,schema[index])
}
}
// it's a simple value nothing to do
}
def jsonTxt = '''{
"timestamp": "2016-04-14T17:53:29Z",
"id": "544cc493-8f4a-4f14-b95b-2c127f54caac",
"endpoints": [
{
"label": "Gify",
"branches": [
{
"url": "/gify/v1.0/",
"name": "test",
"api_version": "1.0",
"label": "test"
}
],
"appname": "gify"
},
{
"label": "x1",
"branches": [
{
"url": "/x1/v1.0/",
"name": "test",
"api_version": "1.0",
"label": "test"
}
],
"appname": "gify2"
}
]
}'''
// template to validate the names
def template = '''{
"label": "",
"branches": [
{
"url": "",
"name": "",
"api_version": "",
"label": ""
}
],
"appname": ""
}'''
def slurper = new JsonSlurper()
// parse your response and the expected template
def json = slurper.parseText(jsonTxt)
def jsonTemplate = slurper.parseText(template)
// check if each endpoint are well formed against the template
json.endpoints.each {
compareJsonNames(it,jsonTemplate)
}
Надеется, что это помогает,
Что у вас до сих пор? Что вы пробовали? Вы должны иметь возможность собирать различные значения и проверять, что у вас есть такое же количество из них, что и ключи –
. Я попытался, но def endpoint = context.expand ('$ {login # Endpoint}') def response = context.expand ('$ {login # Response # declare namespace ns1 = \ 'https: //au.io/ns/201 \'; // ns1: login_resp [1]/ns1: item [1]/ns1: response [1]} ') def label1 endpoint.label [0] = ("label") assert endpoint.contains (label1) –
Можете ли вы поместить это в вопрос? Код невозможно прочитать в комментариях –