假设我正在创建用户,我可以从2个不同的存储库(本地服务器,中央集线器)获取这些用户详细信息。
所以当我为这个API做一个GET方法时,我会收到一组值,(比如说这个GET方法来自本地服务器),当我做另一个GET时(比如说这个GET方法来自中心集线器)。
我的要求是比较这两种不同的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 :(得分:2)
下面,我假设resp1Str
和resp2Str
都包含原始帖子中的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
。它将每个地图转换为UserInfo
对象,可以通过compareUser
(此处未列出)进行比较:
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
的实施只是比较keys
和values
(我们会看到keys
已排序,values
按键排序):
def compareUser = { userInfo1, userInfo2 ->
(userInfo1.keys == userInfo2.keys) && (userInfo1.values == userInfo2.values)
}
最后,我们需要了解如何将地图转换为使用Groovy UserInfo
功能的Expando
:
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 :(得分: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)