Groovy сравнивает два json с неизвестными именами и значениями узлов

У меня есть API отдыха для тестирования, и мне нужно сравнить два ответа json. Ниже вы можете найти структуру файла. Оба файла для сравнения должны содержать одинаковые элементы, но порядок может быть разным. К сожалению, имена, тип (простой, массив) и количество ключей (root, nodeXYZ) также неизвестны.

{"root": [{
   "node1": "value1",
   "node2": "value1",
   "node3":    [
            {
         "node311": "value311",
         "node312": "value312"
      },
            {
         "node321": "value321",
         "node322": "value322"
      }
   ],
   "node4":    [
            {
         "node411": "value411",
         "node412": "value413",
         "node413": [         {
            "node4131": "value4131",
            "node4132": "value4131"
         }],
         "node414": []
      }
      {
         "node421": "value421",
         "node422": "value422",
         "node423": [         {
            "node4231": "value4231",
            "node4232": "value4231"
         }],
         "node424": []
      }]
   "node5":    [
      {"node51": "value51"},
      {"node52": "value52"},
   ]
}]}

Я нашел полезную информацию в Groovy - сравните два объекта JSON (та же структура) и возвращают ArrayList, содержащий различия Получение узла из ответа Json Groovy: как мне искать json со значением ключа и находить его дочерние элементы в groovy, но я не смог объединить его в решение. Я думал, что решение может выглядеть так:

take root
get root children names
check if child has children and get their names
do it to the lowest leve child

Со всеми именами сравнение должно быть легким (я думаю) К сожалению, мне не удалось получить ключи под root


person Michał Surdy    schedule 29.10.2015    source источник


Ответы (2)


Просто сравните прихлебанные карты:

def map1 = new JsonSlurper().parseText(document1)
def map2 = new JsonSlurper().parseText(document2)

assert map1 == map2
person tim_yates    schedule 29.10.2015
comment
Это работает, какие-нибудь советы, как извлечь дельту из этого сравнения? - person Michał Surdy; 29.10.2015
comment
Вам нужно будет написать что-то, что будет проходить по картам и выяснять, в чем заключаются различия ... - person tim_yates; 29.10.2015
comment
Утверждение не будет работать, если поля Json в соответствующих документах не в порядке, ограничивающем полезность этого подхода. - person Swami PR; 06.07.2016
comment
@tim_yates, простое и красивое решение. Как насчет игнорирования определенных полей, таких как даты, идентификаторы и т. Д., При сравнении? Это нужно, чтобы пройти карту и настроить сравнение? или любым простым способом? - person Rao; 01.01.2018
comment
если порядок одних и тех же ключей различается на двух картах, будет ли он утвержден как одинаковый? - person Moses Liao GZ; 01.03.2021
comment
да. Попробуй - person tim_yates; 07.03.2021

Попробуйте библиотеку JSONassert: https://github.com/skyscreamer/JSONassert. Тогда вы можете использовать:

JSONAssert.assertEquals(expectedJson, actualJson, JSONCompareMode.STRICT)

И вы получите красиво отформатированные дельты, например:

java.lang.AssertionError: Resources.DbRdsLiferayInstance.Properties.KmsKeyId
Expected: kms-key-2
     got: kms-key
person Josef Šustáček    schedule 15.09.2016