【问题标题】:How can I sort a multi-level JSON in-string by Key then by Value?如何按键然后按值对多级 JSON 字符串进行排序?
【发布时间】:2019-02-05 03:13:42
【问题描述】:

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

}

这两种反应在某种意义上是相同的,但不幸的是,它们不适合我的情况。 Sample 2 是无序的,Sample 1 是有序的。如果两个响应我都先下订单,它们将是相同的。对于我的调查,我使用以下站点进行 JSON 排序。

novicelab.org/jsonabc

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

【问题讨论】:

  • 您能否提供一些示例 JSON 以更好地阐明?
  • 我已经扩展了我的查询描述部分作为您的问题反馈。

标签: json sorting groovy java-8 jsonslurper


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

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

    import groovy.json.*
    
    def one = new JsonSlurper().parseText(sample1)
    def two = new JsonSlurper().parseText(sample2)
    
    one.Products as Set == two.Products as Set
    

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2023-04-04
      • 1970-01-01
      • 2020-03-19
      • 2015-04-06
      • 2022-01-10
      相关资源
      最近更新 更多