Как можно отсортировать многоуровневую строку JSON по ключу, а затем по значению? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть приложение, которое может сравнить ответ JSON от нескольких развертываний, написанных на Groovy (на основе JDK8).Цель состояла в том, чтобы сравнить ответ JSON, который я получаю от нескольких серверов.Пока что полученный ответ не в порядке сортировки.Таким образом, хотя оба ответа одинаково оцениваются из-за неупорядоченности, они не сопоставимы.Если существует алгоритм для смягчения любого многоуровневого ответа JSON для сортировки их по ключу уровня, то по соответствующему значению Моя проблема может быть решена.Есть также некоторый ключ, который нужно игнорировать, например, ответ на метку времени.Обычно я игнорирую это из моего сравнения по другой логике.

Пожалуйста, не стесняйтесь задавать мне любые дополнительные вопросы, которые имеют отношение к моему вопросу.

Обратная связь:

Sample1:

{
"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"
        }
    }
]

}

Sample2:

{
"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 голосов
/ 05 февраля 2019

Предполагая, что все они уникальны, вы можете сравнить их как наборы вместо списков (там, где важен порядок):

import groovy.json.*

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

one.Products as Set == two.Products as Set
0 голосов
/ 05 февраля 2019
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)
...