【问题标题】:Return elements of a JSON object as an array将 JSON 对象的元素作为数组返回
【发布时间】:2020-09-08 14:12:18
【问题描述】:

我有一个通过 TRANSFORM MESSAGE 转换为 JSON 对象的 XML 文件:

%dw 2.0
output application/json
---
payload

生成的 JSON 对象的格式为:

{
  "Items": {
    "Item": {
      "ItemId": "123",
      "OrganizationId": "456",
      "OrganizationCode": "ABC",

其中有 1 个“项目”和 112 个“项目”。我想要的是返回一个包含所有 ItemId 的 JSON 数组。我正在尝试在 FOREACH 中使用 TRANSFORM MESSAGE。 FOREACH 在收集字段中有“有效负载”,而 TRANSFORM MESSAGE 有:

%dw 2.0
output application/json
---
myItems: payload.items.*item map (item, index) -> {
    "myItemId" : item.ItemId
}

但是,它总是返回所有内容,即整个 JSON 对象。我不知道我的 FOREACH 是错还是 TRANSFORM MESSAGE 错了,但它总是返回整个 JSON 对象。


传入的 JSON 示例如下:

{
  "Items": {
    "Item": {
      "ItemId": "8041",
      "OrganizationId": "12",
      "OrganizationCode": "ABC",
    },
    "Item": {
      "ItemId": "8050",
      "OrganizationId": "12",
      "OrganizationCode": "ABC",
    },
    "Item": {
      "ItemId": "3801",
      "OrganizationId": "12",
      "OrganizationCode": "ABC",
    }
  }
}

输出应该是:["8041", "8050", "3801"]。解析 Item 元素,提取 ItemID 值并创建 JSON 数组。

【问题讨论】:

  • 为了能够帮助您,请分享 XML 输入。请注意,DataWeave 中没有 foreach。你指的是map()函数。
  • 它是 FOR EACH 模块。 map() 函数位于 FOR EACH 内的 TRANSFORM MESSAGE 中。但是,我刚刚被告知进入 FOR EACH 的有效载荷结构与出来的有效载荷结构完全相同。我必须将我正在创建的 JSON 数组分配给一个变量并使用 SET PAYLOAD 将变量发送出去。
  • 为了获取在 FOR EACH 模块中创建的 JSON 数组,我是否必须在外部创建一个全局数组,然后将映射的输出分配给该变量?有人这样做的例子吗?
  • 如果问题是关于 Foreach 范围的,您应该添加输入和包括 foreach 的 sn-p。但是,使用您共享的转换或类似的东西似乎更容易做到这一点。如果您分享输入和预期输出,我们可以试一试。
  • 上面添加了一个例子。实际的 ITEM 元素很大(20K 行),但我想要的只是项目 ID。

标签: anypoint-studio mulesoft


【解决方案1】:

您的脚本运行良好。请允许我提一下,从 XML 转换为 JSON 的第一次转换会适得其反。下一个转换必须解析 JSON 以发出 JSON。最好一步完成,从 XML 到 JSON。如果需要中间结果做其他处理,最好转成Java(application/java),处理,等需要最终输出的时候,再转成最终的JSON格式。在 XML 或 JSON 中处理中间步骤只会消耗更多资源。

基于此,我使用了以下 XML 输入:

<Items>
    <Item>
        <ItemId>8041</ItemId>
        <OrganizationId>12</OrganizationId>
        <OrganizationCode>ABC</OrganizationCode>
    </Item>
    <Item>
        <ItemId>8050</ItemId>
        <OrganizationId>12</OrganizationId>
        <OrganizationCode>ABC</OrganizationCode>
    </Item>
    <Item>
        <ItemId>3801</ItemId>
        <OrganizationId>12</OrganizationId>
        <OrganizationCode>ABC</OrganizationCode>
    </Item>    
</Items>    

脚本:

%dw 2.0
output application/json
---
payload.Items.*Item map (item, index) -> item.ItemId

输出:

[
  "8041",
  "8050",
  "3801"
]

同样的脚本也适用于您的 JSON 输入。

【讨论】:

  • 胜利!这正是我需要的!只是出于好奇,我会改变什么来返回一个对象而不是一个数组?非常感谢!
  • 类似(payload.Items.*Item map (item, index) -&gt; {ItemId: item.ItemId}) reduce ((i, accumulator={}) -&gt; accumulator ++ i) ?它会多次返回相同的密钥,这不利于以后处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多