Чтение значения массива с помощью Dataweave в Mule - PullRequest
2 голосов
/ 10 июля 2019

Я пытаюсь использовать dataweave в Mule для чтения определенных значений данных из входящей полезной нагрузки. Мой пример полезной нагрузки выглядит следующим образом:

 {
    "source": [
        {
            "uri": "entities/1R6xV",
            "createdBy": "API_USER",
            "createdTime": 1562504739146,
            "attributes": {
                "label": "000000000002659654",
                "value": {
                    "Name": [
                        {
                        }
                    ],
                    "Id": [
                        {
                        }
                    ],
                    "Number": [
                        {
                            "type": "config/Types/Number/attributes/Number",
                            "ov": true,
                            "value": "000000000002659654",
                            "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
                        }
                    ]
                }
            }
        }
    ]
}

Если мне нужно прочитать «ярлык», я могу достичь этого с помощью

label: payload.source.attributes.label

Точно так же, как я могу прочитать «значение» в атрибутах> Число. Не работает:

Value: payload.source.attributes.Number.value

Я новичок в Dataweave. Пожалуйста, сообщите.

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Проблема в том, что точка выбора (.) Работает на объекте и массиве объектов.Когда он применяется к массиву, он применяет селектор точек ко всем элементам массива, относящимся к типу object, и возвращает этот результат.

Позволяет переходить по частям

payload.source

Возвращает

[
  {
    "uri": "entities/1R6xV",
    "createdBy": "API_USER",
    "createdTime": 1562504739146,
    "attributes": {
      "label": "000000000002659654",
      "value": {
        "Name": [
          {

          }
        ],
        "Id": [
          {

          }
        ],
        "Number": [
          {
            "type": "config/Types/Number/attributes/Number",
            "ov": true,
            "value": "000000000002659654",
            "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
          }
        ]
      }
    }
  }
]

Пока полезная нагрузка является объектом, он возвращает значение источника, являющегося массивом

payload.source.attributes

Возвращает

[
  {
    "label": "000000000002659654",
    "value": {
      "Name": [
        {

        }
      ],
      "Id": [
        {

        }
      ],
      "Number": [
        {
          "type": "config/Types/Number/attributes/Number",
          "ov": true,
          "value": "000000000002659654",
          "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
        }
      ]
    }
  }
]

Работает нормально, потому что в результате payload.source был завершен массив объектов, поэтому он будет делать этот выбор над этими объектами.

Теперь, когда выexecute

payload.source.attributes.value.Number

Возвращает

[
  [
    {
      "type": "config/Types/Number/attributes/Number",
      "ov": true,
      "value": "000000000002659654",
      "uri": "entities/1R6xV/attributes/Num/1ZtyT/Number/60pvN6"
    }
  ]
]

Это массив массивов, и вот где он сломан.

Мое решение

У вас есть две альтернативы здесь

  • Использование Свести Функция

    flatten (payload.source.attributes.value.Number) .value

  • Использование потомок селектор

    payload.source.attributes.value.Number..value

1 голос
/ 10 июля 2019

Поскольку Number - это массив, вам нужно указать нужный индекс.В этом случае нулевой элемент:

Value: payload.source[0].attributes.value.Number[0].value

Если у вас несколько чисел, это будет выглядеть примерно так:

%dw 1.0
%output application/json
---
values: payload.source[0].attributes.value.Number map {
    value: $.value
}
...