繁体   English   中英

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

[英]How can I sort a multi-level JSON in-string by Key then by Value?

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

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

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)

假设它们都是唯一的,则可以将它们作为“集合”而不是“列表”(在顺序很重要的地方)进行比较:

import groovy.json.*

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

one.Products as Set == two.Products as Set

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM