Как перебрать массив JSON в Mule 3 - PullRequest
0 голосов
/ 19 октября 2018

Mule 3.8.3 Studio 6.4.4

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

Образец входящих данных:

<request func="">
  <data>
    <transactions time='1539262470'>
      <transaction set='customers' notifyid='WMS_NADC_CUSTOMERS' type='update'>
        <customers>
          <customer id="CIT_1113-11" t="1539257721" y="U" w="WebUser"></customer>
          <customer id="C42998-2" t="1539261561" y="N" w="WebUser"></customer>
          <customer id="C42998" t="1539262040" y="U" w="WebUser"> </customer>
        </customers>
      </transaction>
    </transactions>
  </data>
</request>

После получения этого я использую переплетение для преобразования в json в попыткеболее легкий доступ к идентификаторам.

%dw 1.0
%output application/json
---
{
    customers: payload.request.data.transactions.transaction.customers.*customer map (cust, indexOfCustomer) ->{
        customer: cust.@id as :string
    }
}

Преобразованная полезная нагрузка теперь выглядит как

{
  "customers": [
    {
      "customer": "CIT_1113-11"
    },
    {
      "customer": "C42998-2"
    },
    {
      "customer": "C42998"
    }
  ]
}

На этом этапе я пытаюсь перебрать полезную нагрузку.Установка для каждого payload.get('customers') переводит меня в jackson.node.ArrayNode.

Мне не удалось понять, как получить доступ к каждому отдельному объекту в списке.Может кто-нибудь из вас, пожалуйста, скажите мне, как это сделать?

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

{
  "customer": "C42998"
}

1 Ответ

0 голосов
/ 19 октября 2018

Самый простой способ - использовать комбинацию DataWeave для получения Java Iteratable и for-each scope.Посмотрите этот пример (при условии, что входящая полезная нагрузка - ваш XML).

<dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java

%var customers = payload.request.data.transactions.transaction.customers.*customer
---
customers map (customer) ->{
  customer: customer.@id as :string
}]]></dw:set-payload>
</dw:transform-message>
<foreach doc:name="For Each">
    <json:object-to-json-transformer doc:name="Object to JSON"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>
</foreach>

В Mule 3 for-each не будет принимать JSON или XML, даже если они, очевидно, представляют структуру, которая может быть повторена.более (как массив JSON, например).Вот почему нам нужен %output application/java в преобразователе DataWeave.Позже, в рамках for-each, мы можем преобразовать это обратно в JSON.В вашем случае просто замените logger на ваш соединитель очереди, чтобы отправлять сообщения, где это необходимо.

...