2016-08-23 3 views
2

あなたは過去に大きな助けをしてくれましたので、私はあなたがこれを手伝ってくれることを願っています。だから現在、私はsoapuiを使ってJsonペイロードを取得するプロジェクトで働いています。私はいくつかのアサーションを作成する必要があり、その中には共通するものが1つしかない複数のノードを見る必要があります。その1つは、ノードの1つの最初の部分です。SOAPUIに基本JSONパス式の部分文字列メソッドがありますか?

私が探しているのは、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スクリプトには' while'ループのスクリプトがあります。 – Rao

+0

私はappologize、私は私の状況に一致するように私の実際の使用されるコードを変更しました。私は基本的には、データベースからオブジェクト名や実際のデータを使用していない。だからPriceListItemsはバーガージョイントでなければなりません。私は自分のコードを変更して、今すぐ正しいはずです。 –

答えて

2

JointNameの値がBob's、値が3のリストをアサートするGroovyスクリプトは次のとおりです。インラインコメントを見つけてください。

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:別のコメントに基づいて、第一及び第二の価格jointList

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

これは私が探していたようですが、次のステップがあり、私はこれを正しく理解していることを確認したいだけです。私の次のステップは、自分でリストに3つのノードを置くことです。これは、私が探しているノードがあれば、価格を比較し、他のアサーションを行うためです。だから、あなたが使ったfindAllを使って、それをアサートするのではなく、自分のリストに追加できますか? –

+0

@DonnieShannon、その答えの更新を確認してください。 'jointList'はフィルタリングされたデータを保持します。 – Rao

+0

私はしばらくこのことをやっていました。私は最後の一歩を欠いており、あなたが私を助けることができるかどうか疑問に思っていました。私はそのリストを作成することができましたが、今ではそれを使いたいと思います。私が作成したリストを使用した例で言えば、最初のレストランの価格が2番目の価格と同じであることを確認したかったのです。私は、jointList.BurgerBoints [0] .Priceを試してみましたが、私は単にjointList.Priceを試しましたが、どちらも結果を引き上げることはできません。私は何が欠けていますか? –

関連する問題