如何按键然后按值对多级JSON字符串进行排序?

时间:2019-02-05 03:13:42

标签: json sorting groovy java-8 jsonslurper

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

如果您对并行进行多台服务器的有效负载比较测试有其他建议,请告诉我。

2 个答案:

答案 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