2016-08-23 6 views
2

Вы были большой помощью в прошлом, поэтому я надеюсь, что вы можете мне помочь. Так что в настоящее время я работаю над проектом на работе, используя soapui, чтобы вернуть гигантскую полезную нагрузку Json. Мне нужно создать некоторые утверждения, и некоторым из них нужно будет рассмотреть несколько узлов, которые имеют только одну общую черту. Это одна из первых частей одного из узлов.Есть ли метод подстроки для основных выражений JSON Path в SOAPUI?

Так что я ищу какую-то подстроку для JSONPath. Вот пример того, что я ищу.

"BurgerJoints": [ 
      { 
     "JointName": "Bob's Burgers", 
     "Price": 5 
     }, 
     { 
     "JointName": "Bob's Broiler Stand", 
     "Price": 5 
     }, 
     { 
      "JointName": "Burger King", 
      "Price": 5 
     }, 
     { 
      "JointName": "Bob's Beef Haven", 
      "Price": 5 
     }, 
     { 
      "JointName": "Super Weenie Hut", 
      "Price": 5 
     } 
] 

В моем примере предположим, что я ищу все суставы, которые есть у Боба. Поэтому моя первоначальная мысль заключалась в том, чтобы сделать что-то вроде BurgerJoints [? (@. Substring (JointName, 0,3) == "Bob")] , чтобы дать мне узлы. Но похоже, что это не сработало. Может ли кто-нибудь сказать мне, где мой синтаксис поступил не так, или если нет способа сделать это таким образом, что лучше всего для достижения моей цели?

Спасибо, ребята!

EDIT:

Так что я попытался с помощью Groovyscript, чтобы сделать это, и я думаю, что я получил близко, но где-то списки не заселять. Вот код, который я использую

//imports 
import groovy.json.JsonSlurper 

//grab the response 
def ResponseMessage = messageExchange.response.responseContent 
//define a JsonSlurper 
def jsonSlurper = new JsonSlurper().parseText(ResponseMessage) 

//verify the slurper isn't empty 
assert !(jsonSlurper.isEmpty()) 

def jsonlist =[] 

def i = 0 

while (jsonSlurper.BurgerJoints[i] != null) 
{ 
if(jsonSlurper.BurgerJoints[i].JointName.toString().substring(0,3)=="Bob") 
    { 
     jsonlist.add(jsonSlurper.BurgerJoints[i]) 

    } 

    i++ 
} 


def jsonlist2 = new JsonSlurper().parseText(jsonlist.toListString()) 

assert jsonlist2.size()==3 

Все еще не работает, к сожалению.

+0

показано ли ответ на вопрос полного или только часть его? Потому что в ответе не удалось найти 'jsonSlurper.PriceListItems', но groovy script имеет это в цикле' while'. – Rao

+0

Я appologize, я изменил свой фактический используемый код, чтобы соответствовать ситуации, в которой я нахожусь. В основном я просто не использовал имена объектов или фактические данные из базы данных. Поэтому PriceListItems должен быть burgerjoints. Я изменил свой код, чтобы он теперь был прав. –

ответ

2

Вот описание Groovy Script, который содержит список JointName, содержит значение Bob's со значением 3. Пожалуйста, найдите встроенные комментарии.

import groovy.json.JsonSlurper 
//Defining json string a fixed value. Of course, you can use dynamic value 
//using messageExchange like you shown in your question. 
def jsonString = ''' 
{ 
"BurgerJoints": [ 
      { 
     "JointName": "Bob's Burgers", 
     "Price": 5 
     }, 
     { 
     "JointName": "Bob's Broiler Stand", 
     "Price": 5 
     }, 
     { 
      "JointName": "Burger King", 
      "Price": 5 
     }, 
     { 
      "JointName": "Bob's Beef Haven", 
      "Price": 5 
     }, 
     { 
      "JointName": "Super Weenie Hut", 
      "Price": 5 
     } 
] 
} 
''' 
//Parse the string, create slurper object 
def json = new JsonSlurper().parseText(jsonString) 
//find all JointNames which contains Bob's, and apply size, and assert with 3 
assert json.BurgerJoints.findAll { it.JointName.contains('Bob\'s')}.size() == 3 

UPDATE: Основываясь на комментарий, добавив дополнительные заявления, которые помогают добиться того, что автор этого вопроса ищет.

def jointList = json.BurgerJoints.findAll { it.JointName.contains('Bob\'s')} 
log.info jointList 

UPDATE 2: Основываясь на другой комментарий, проверить, если цена 1-го и 2-го, равны от jointList

assert jointList[0].Price == jointList[1].Price 
+0

Это похоже на то, что я искал, но есть следующий шаг, и я просто хочу убедиться, что я правильно понимаю это. Мой следующий шаг состоит в том, чтобы иметь эти 3 узла в списке сами по себе, Это потому, что я буду сравнивать цены и делать некоторые другие утверждения, как только у меня есть узлы, которые я ищу. Итак, используя findAll, который вы только что использовали, вместо того, чтобы утверждать на нем, могу ли я добавить его в свой собственный список? –

+0

@ DonnieShannon, пожалуйста, проверьте обновление в ответе. 'jointList' содержит отфильтрованные данные. – Rao

+0

Я уже давно общался с этим, и я пропустил последний шаг и задавался вопросом, можете ли вы мне помочь. Мне удалось заполнить этот список, но теперь я хочу его использовать. Поэтому скажем, что для примера я использовал список, который мы создали. и я хотел убедиться, что цена первого ресторана была такой же, как и цена второго. Я пробовал jointList.BurgerBoints [0] .Price, и я пробовал просто jointList.Price, но ни один из них, похоже, не смог поднять результат. Что мне не хватает? –