使用dwl 1.0替换数组中的特定值

时间:2019-07-03 01:28:10

标签: mule transformation dataweave

正确使用mapObject函数的问题。 尝试保留现有的数组结构,但计算车辆数和属性,并更新包含该值的现有数组。 一般数据来自一个来源,车辆数据来自另一个来源,属性数据来自另一个来源。因此,合并时,我必须使用其他源数据的计数来更新GENERAL数据。 另外,GENERAL是一个数组对象,它将始终具有1。因此,使用GENERAL [0]是安全且良好的。

原始有效载荷

[
  {
    "commId": "1",
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ]
  },
  {
    "commId": "2",
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ]
  },
  {
    "commId": "3",
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": "TODO",
        "PROPERTY_COUNT": "TODO"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ]
  }
]

尝试使用map遍历有效负载,并尝试修改2个属性,但仅设法映射了一个,但即使输出了错误的结果。

test map (item, index) -> {
    (item.GENERAL[0] mapObject (value, key) -> { 
        (key): (value == sizeOf (item.VEHICLE)
                when (key as :string) == "VEHICLE_COUNT" 
                otherwise value)
    })
}

预期输出:

[
  {
    "commId": "1",
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": "2",
        "PROPERTY_COUNT": "1"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ]
  },
  {
    "commId": "2",
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": "1",
        "PROPERTY_COUNT": "2"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ]
  },
  {
    "commId": "3",
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": "3",
        "PROPERTY_COUNT": "0"
      }
    ],
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ]
  }
]

到目前为止得到的输出完全错误:

[
  {
    "ID": "G1",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  },
  {
    "ID": "G2",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  },
  {
    "ID": "G3",
    "VEHICLE_COUNT": false,
    "PROPERTY_COUNT": "TODO"
  }
]

1 个答案:

答案 0 :(得分:0)

已修改:更新以进行动态转换

下面的数据编织转换并不是特别有吸引力,但是它可能对您有用。

感谢克里斯蒂安·基巴纳(Christian Chibana)通过回答以下问题来帮助我找到一个动态的答案:Why does Mule DataWeave array map strip top level objects?

%dw 1.0
%output application/json
---
payload map ((item) -> 
    (item - "GENERAL") ++
    GENERAL: item.GENERAL map (
        $ - "VEHICLE_COUNT"
          - "PROPERTY_COUNT"
          ++ { VEHICLE_COUNT: sizeOf (item.VEHICLE default []) }
          ++ { PROPERTY_COUNT: sizeOf (item.PROPERTY default []) }
    )
)

它是动态的,因此应在复制所有内容时对其进行复制,并且仅要更新两个字段。

此转换的输出以及您提供的输入如下。与您所希望的唯一区别是计数以数字而不是字符串显示。如果您真的需要它们作为字符串,则可以像(sizeOf (comm.VEHICLE default [])) as :string,

[
  {
    "commId": "1",
    "VEHICLE": [
      {
        "ID": "V1-1"
      },
      {
        "ID": "V1-2"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P1-1"
      }
    ],
    "GENERAL": [
      {
        "ID": "G1",
        "VEHICLE_COUNT": 2,
        "PROPERTY_COUNT": 1
      }
    ]
  },
  {
    "commId": "2",
    "VEHICLE": [
      {
        "ID": "V2-1"
      }
    ],
    "PROPERTY": [
      {
        "ID": "P2-1"
      },
      {
        "ID": "P2-2"
      }
    ],
    "GENERAL": [
      {
        "ID": "G2",
        "VEHICLE_COUNT": 1,
        "PROPERTY_COUNT": 2
      }
    ]
  },
  {
    "commId": "3",
    "VEHICLE": [
      {
        "ID": "V3-1"
      },
      {
        "ID": "V3-2"
      },
      {
        "ID": "V3-3"
      }
    ],
    "GENERAL": [
      {
        "ID": "G3",
        "VEHICLE_COUNT": 3,
        "PROPERTY_COUNT": 0
      }
    ]
  }
]
相关问题