将JSON对象的元素作为数组返回

问题描述

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

%dw 2.0
output application/json
---
payload

生成的JSON对象的格式为:

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

其中有一个“项目”和112个“项目”。我想要返回一个包含所有ItemIds的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",},"Item": {
      "ItemId": "8050","Item": {
      "ItemId": "3801",}
  }
}

输出应为:[“ 8041”,“ 8050”,“ 3801”]。解析Item元素,提取ItemID值并创建一个JSON数组。

解决方法

您的脚本运行良好。让我提到,从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输入配合使用。