Как использовать eval в карате?

Я уже просмотрел документацию по карате и попробовал следующий код:

 * eval if (nearby.content[?(@.title == 'Nearby Malls & Restaurants')] == '#notnull') karate.call(* def nearByMallsRestraurants = get nearby.content[?(@.title == 'Nearby Malls & Restaurants')].items[?(@.name)])

Но это ошибка выброса. Я пытаюсь извлечь все названия ближайших торговых центров и ресторанов, если в массиве ближайших мест и достопримечательностей содержатся соседние торговые центры и ресторан. Также, если возможно, вы можете рассказать мне, как использовать collection.sort для сортировки имен ближайших торговых центров.

Мой json выглядит так:

"nearby": {
        "title": "Nearby Places and Landmarks",
        "content": [
          {
            "title": "Nearby Malls & Restaurants",
            "items": [
              {
                "name": "Forum Mall, Koramangala",
                "distance": 1.8
              },
              {
                "name": "Eggzotic",
                "distance": 2.4
              },
              {
                "name": "Kerala Pavilion Restaurant",
                "distance": 2.4
              },
              {
                "name": "New Shanthi Nagar",
                "distance": 2.5
              },
              {
                "name": "Venus Biryani",
                "distance": 2.8
              }
            ]
          },
          {
            "title": "Closest Airport, Railway Station & Bus Stand",
            "items": [
              {
                "name": "Madiwala Ayyappa Temple Bus Stop",
                "distance": 2.1
              },
              {
                "name": "Kalasipalyam Bus Stand",
                "distance": 5.7
              },
              {
                "name": "Bangalore Cantonment Railway Station",
                "distance": 6.5
              },
              {
                "name": "Kempegowda/ Majestic bus station",
                "distance": 7
              },
              {
                "name": "KSR Bengaluru City Railway Station",
                "distance": 7.5
              },
              {
                "name": "KR Puram Railway Station",
                "distance": 8.5
              },
              {
                "name": "KSRTC Mysore Road Satellite Bus Stop",
                "distance": 9
              }
            ]
          }
        ]
      }

person Gaurav Kinra    schedule 26.06.2018    source источник


Ответы (1)


Обратите внимание - JsonPath - это не JS, и вы здесь смешиваете. Мой совет - не усложняйте ситуацию и не разбивайте ее на несколько этапов. Это должно ответить на все ваши вопросы, в том числе:

* def malls = $nearby.content[?(@.title=='Nearby Malls & Restaurants')]
* def names = $malls..name
* def Collections = Java.type('java.util.Collections')
* eval Collections.sort(names)
* print names

выход:

[
  "Eggzotic",
  "Forum Mall, Koramangala",
  "Kerala Pavilion Restaurant",
  "New Shanthi Nagar",
  "Venus Biryani"
]
person Peter Thomas    schedule 26.06.2018
comment
Спасибо @ Peter. Но я пытаюсь извлечь все Nearby Malls & Restaurants имена, только если Nearby Places and Landmarks содержит Nearby Malls & Restaurants json, поскольку Nearby Malls & Restaurants не является обязательным. - person Gaurav Kinra; 26.06.2018
comment
@GauravKinra, это абсолютно нормально, вы пробовали? добавьте эту строку и посмотрите, что произойдет, если у вас нет торговых центров: * eval if (names.length == 0) karate.log('no malls found') - person Peter Thomas; 27.06.2018
comment
Привет, Питер, нужна небольшая помощь, связанная с этим, только сейчас у меня есть api, который возвращает данные price": { "pretax_price": 7002.84, "rack_rate": 8140.82, "wallet_deductable_amount": 0, "voucher_amount": 0, "total_discount_percent": 92.75, "net_payable_amount": 4131.68, }. Теперь то, что я пытаюсь сделать, это * def pretax =price.pretax_price должно вызываться только в том случае, если * def valueFromDB == true, где valueFromDB поступает из БД. - person Gaurav Kinra; 23.08.2018
comment
@GauravKinra, пожалуйста, сделайте это в новом вопросе. - person Peter Thomas; 23.08.2018