Как разделить несколько значений параметра в ответе JSON? - PullRequest
0 голосов
/ 13 февраля 2019

Мой ответ JSON имеет несколько значений для одного атрибута, как скопировано ниже.

{
   "version": "10.2.2.48",
   "systemMessages": [   {
      "code": -8010,
      "error": "",
      "type": "error",
      "module": "BROKER"
   }],
   "locations": [   {
      "id": "10101102",
      "name": "Bus Stop",
      "disassembledName": "Bus",
      "coord":       [
         3755258,
         4889121
      ],
      "type": "stop",
      "matchQuality": 1000,
      "isBest": true,
      "modes":       [
         1,
         5,
         11
      ],
      "parent":       {
         "id": "95301001|1",
         "name": "Sydney",
         "type": "locality"
      },
      "assignedStops": [      {
         "id": "10101102",
         "name": "Bus Stop",
         "type": "stop",
         "coord":          [
            3755258,
            4889121
         ],
         "parent":          {
            "name": "Sydney",
            "type": "locality"
         },
         "modes":          [
            1,
            5,
            11
         ],
         "connectingMode": 100
      }]
   }]
}

Обратите внимание, что у "mode" есть 3 значения.Если я пытаюсь извлечь значение режимов с помощью утверждения скрипта JsonSlurper, оно дает значение как [1,5,11] и считается как 1. Я хочу разделить их на 3 элемента массива или переменные и мне нужно считать как 3.Какой возможный код подтверждения скрипта?

Утверждение:

import groovy.json.JsonSlurper
def resp = messageExchange.response.responseContent;
def jsl = new JsonSlurper().parseText(resp);
def modes = jsl.locations.modes
log.info modes
log.info modes.size()

Результат:

Wed Feb 13 10:50:49 AEDT 2019:INFO:[[1, 5, 11]]

Wed Feb 13 10:50:49 AEDT 2019:INFO:1

1 Ответ

0 голосов
/ 13 февраля 2019

В этом примере вы имеете дело с сокращенной версией оператора распространения Groovy , и ваш код возвращает верный результат.Когда вы звоните jsl.locations, вы фактически получаете доступ к списку всех объектов местоположений (в вашем примере это одноэлементный список).Когда вы звоните

jsl.locations.modes

, вы используете сокращенную версию

jsl.locations*.modes

, которая эквивалентна следующему коду:

jsl.locations.collect { it.modes }

Этот код означает: итерацияlocations и преобразование списка местоположений в список списков режимов этих местоположений - [[1,5,11]].

Применение правильного решения зависит от еще нескольких факторов.Например, вам нужно рассмотреть список locations, содержащий несколько местоположений - в этом случае преобразование jsl.locations.modes может дать результат, подобный [[1,5,11],[1,5,11],[2,4,9]] - список из трех списков режимов.

Если вы предполагаете, что всегда возвращается единственное местоположение, то вы можете просто сгладить окончательный список, например:

def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11]
assert modes.size() == 3

Однако, если locations содержит другой объект JSON, скажем,с точно такими же режимами, тогда он даст совершенно другой результат:

def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11,1,5,11]
assert modes.size() == 6

В этом случае может быть лучше использовать утверждения типа:

def modes = jsl.locations.modes
assert modes == [[1,5,11],[1,5,11]]
assert modes*.size() == [3,3]

, что означает:

  • modes хранит 2 списка [1,5,11] и [1,5,11],
  • , размер первого списка равен 3, а размер второго списка также равен 3.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...