如何迭代 Mule 3 中的 JSON 数组

How to iterator over a JSON Array in Mule 3

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>

收到后,我使用 weave 转换为 json 以尝试更轻松地访问 id。

%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"
    }
  ]
}

此时,我正在尝试循环访问有效负载。将 for each 设置为 payload.get('customers') 会将我带入 jackson.node.ArrayNode。

我一直无法弄清楚如何访问列表中的每个单独的对象。你们谁能告诉我怎么做吗?

我想最终将有效负载放入看起来像

的消息队列
{
  "customer": "C42998"
}

最简单的方法是结合使用 DataWeave 来获得 Java Iteratablefor-each 范围。查看此示例(假设传入的有效负载是您的 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 数组,例如)。这就是我们在 DataWeave 转换器中需要 %output application/java 的原因。稍后,在 for-each 范围内,我们可以将其转换回 JSON。在您的情况下,只需将 logger 替换为您的队列连接器即可在需要的地方发送消息。