0

我有一个应用程序,可以比较用 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 排序。

novicelab.org/jsonabc

如果您对在多个服务器上并行进行类似的有效负载比较测试有任何其他建议,请告诉我。

4

2 回答 2

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)
于 2019-02-05T08:36:22.610 回答
0

假设它们都是唯一的,您可以将它们作为集合而不是列表进行比较(其中顺序很重要):

import groovy.json.*

def one = new JsonSlurper().parseText(sample1)
def two = new JsonSlurper().parseText(sample2)

one.Products as Set == two.Products as Set
于 2019-02-05T09:46:21.690 回答