我有一个应用程序,可以比较来自用Groovy(基于JDK8)编写的多个部署的JSON响应。目的是想比较我从多个服务器获得的JSON响应。目前,我得到的响应不是按排序的。因此,尽管由于无序,两个响应的值相同,但它们不可比较。如果有一种算法可以软化任何多级JSON响应,以按其级别键对它们进行排序,然后按其对应的值进行排序,则可以解决我的问题。还有一些键需要忽略,例如时间戳响应。通常,我通过比较逻辑忽略了这一点。
请随时问我任何与我的问题有关的问题。
反馈:
样本1:
{
"Products": [{
"Product": {
"productId": "91e61245",
"productName": "prod_name3",
"productNo": "100000319714"
}
},
{
"Product": {
"productId": "a3e82487",
"productName": "prod_name2",
"productNo": "100000319701"
}
},
{
"Product": {
"productId": "75f80523",
"productName": "prod_name1",
"productNo": "100000319707"
}
}
]
}
样本2:
{
"Products": [
{
"Product": {
"productId": "75f80523",
"productName": "prod_name1",
"productNo": "100000319707"
}
},
{
"Product": {
"productId": "91e61245",
"productName": "prod_name3",
"productNo": "100000319714"
}
},
{
"Product": {
"productId": "a3e82487",
"productName": "prod_name2",
"productNo": "100000319701"
}
}
]
}
从某种意义上讲,这两种答复在某种意义上是相同的,但不幸的是,它们都不适合我的情况。 样品2 是无序的,而样品1 是有序的。如果两个人都先下订单,它们将是相同的。为了进行调查,我使用以下站点进行JSON排序。
如果您对并行进行多台服务器的有效负载比较测试有其他建议,请告诉我。
答案 0 :(得分:0)
def data=new groovy.json.JsonSlurper().parseText('''{
"Products": [{
"Product": {
"productId": "91e61245",
"productName": "prod_name3",
"productNo": "100000319714"
}
},
{
"Product": {
"productId": "a3e82487",
"productName": "prod_name2",
"productNo": "100000319701"
}
},
{
"Product": {
"productId": "75f80523",
"productNo": "100000319707",
"productName": "prod_name1"
}
}
]
}''')
def deepSort(Object o){
if(o instanceof Map){
o=new TreeMap(o) //TreeMap sorted by keys
o.each{e-> e.setValue( deepSort(e.getValue()) ) }
}else if(o instanceof List){
for(int i=0;i<o.size();i++)o[i]=deepSort(o[i])
}
return o
}
println data
println deepSort(data)
答案 1 :(得分:0)
假设它们都是唯一的,则可以将它们作为集合而不是列表(在顺序很重要的地方)进行比较:
import groovy.json.*
def one = new JsonSlurper().parseText(sample1)
def two = new JsonSlurper().parseText(sample2)
one.Products as Set == two.Products as Set