2017-11-06 2 views
-1

ユーザーを作成していて、2つの異なるリポジトリ(ローカルサーバー、中央ハブ)からこれらのユーザーの詳細を取得できます。soapuiの2つの異なるAPIからの2つの異なるjson応答を比較するには?

だから私はこのAPIのGETメソッドを実行すると、(このGETメソッドはローカルサーバーからの)値のセットを受け取り、別のGET(このGETメソッドはセントラルハブからのものです)を実行します。

私の要件は、これらの2つの異なるAPIレスポンスが同じかどうかを比較することです。これを達成する方法は?
サンプル応答:以下

[ 
     { 
     "name": "ABCD", 
     "user": "TEMP_USER", 
     "description": null, 
     "createdtime": "2017-11-06 11:11:18", 
     "groupname": "XYZ", 
     "tempId": 101998, 
    }, 
{ 
     "name": "EFGH", 
     "user": "TEMP_USER", 
     "description": null, 
     "createdtime": "2017-11-05 11:11:18", 
     "groupname": "XYZ", 
     "tempId": 101999, 
    } 
] 
+0

Basavaraj、ここでは、上記の2つの応答を比較したいですか? – Rao

+1

期待どおり、2番目の応答も最初の応答と同じにする必要があります。だからあなたは両方を同じものとみなして比較することができます。 – Basavaraj

答えて

2

、私はresp1Strresp2Str両方がオリジナルのポストからJSONが含まれていることを仮定しています。

コードの壁を掲示するのではなく、解決策を構築できます(hereも記載されています)。まず、マップのリストにJSONをパース考慮し、nameでリストを並べ替える:

def resp1 = new groovy.json.JsonSlurper().parseText(respStr1) 
def resp2 = new groovy.json.JsonSlurper().parseText(respStr2) 

resp1.sort{a,b -> a.name <=> b.name} 
resp2.sort{a,b -> a.name <=> b.name} 

assert compareUsers(resp1, resp2) 

は今、私たちはcompareUsersを実装する必要があります。それはcompareUser(ここに記載されていない)を経由して比較することができUserInfoオブジェクトに各マップを変換します

def compareUsers = { resp1, resp2 -> 
    def result = true 

    if (resp1.size() == resp2.size()) { 
     // assume lists are sorted 
     [resp1, resp2].transpose().each { 
      def userInfo1 = buildUserInfo(it[0]) 
      def userInfo2 = buildUserInfo(it[1]) 
      if (result) { 
       result = compareUser(userInfo1, userInfo2) 
      } 
     } 
    } else { 
     result = false 
    } 

    result 
} 

compareUserの実装は単にkeysvaluesを比較して(私たちはkeysがソートされ、valuesがキーでソートされていることがわかります):最後に

def compareUser = { userInfo1, userInfo2 -> 
    (userInfo1.keys == userInfo2.keys) && (userInfo1.values == userInfo2.values) 
} 

、私たちは、GroovyのExpando機能を使用していますUserInfo、にマップを変換する方法を参照する必要があります。

def buildSortedList = { items -> 
    def list = [] 
    list.addAll(items) 
    Collections.sort(list) 
    list 
} 

def buildUserInfo = { user -> 
    def result = new Expando() 
    result.keys = buildSortedList(user.keySet()) 
    result.values = [] 
    result.keys.each { key -> result.values << user[key] } 
    result 
} 
1
@Grab(group='org.skyscreamer', module='jsonassert', version='1.5.0', scope='test') 

import org.skyscreamer.jsonassert.JSONAssert; 

def a='''[{ 
     "name": "ABCD", 
     "user": "TEMP_USER", 
     "description": null, 
     "createdtime": "2017-11-06 11:11:18", 
     "groupname": "XYZ", 
     "tempId": 101998 
}]''' 
def b='''[{ 
     "name": "ABCD", 
     "user": "TEMP_USER", 
     "description": null, 
     "createdtime": "2017-11-06 11:11:18", 
     "groupname": "XYZ", 
     "tempId": 1019981 
}]''' 

JSONAssert.assertEquals(a,b,false) 
+0

しかし、aとbを定義するには、値aは何でもかまいません。確かにbの値はaと同じでなければならない。だから私たちは、応答から選ぶ方法を知っていないときに、それをbの応答と比較しますか? – Basavaraj

+1

どういう意味ですか?あなたは言った: '私は2つの異なるリポジトリからこれらのユーザーの詳細を取得できます'。 'a'と' b'はあなたの2つのサービスからのjson応答です。コードスニペットを実行するには、それらを定数として配置します。 – daggett

+0

はい、これらのユーザーの詳細を取得できます。しかし、私が伝えようとしていることは、価値がダイナミックになることです。例えば。今日は名前がABCDの場合はXYZにすることができます。だからそのような場合には私は定義できません。しかし、欲望はaであり、bは同じでなければならない。 – Basavaraj

関連する問題