5
votes

DataWeave doesn't like what I'm trying to do with it, and I'm not sure if I'm doing something wrong, or if it is a limitation of DataWeave that isn't possible.

Here's the scenario: I'm querying Salesforce and getting two values back: lets call them X and Y.

Here's the return I want [{X:Y}, {X2:Y2}, {X3:Y3}, ...] however, using DataWeave it doesnt seem possible to get a key value pair like that, instead, it only seems possible to specifically set the Key for each value in the script like so: [{Value_X: X, Value_Y: Y}, {Value_X: X2, Value_Y: Y2}, ...]

Here is my current DataWeave script that works, but gives me the second result:

%dw 1.0
%output application/java
---

payload map {
    Value_X: $.X,
    Value_Y: $.Y
}

And here's the DataWeave script that I wish worked, but doesn't

%dw 1.0
%output application/java
---

payload map {
    $.X: $.Y
}
7

7 Answers

12
votes

In order for your Dataweave code to work properly, you need to surround the variable you want to use as a key with parentheses:

%dw 1.0
%output application/java
---

payload map {
    ($.X): $.Y
}
8
votes

Can you try what is in the image below?

enter image description here

1
votes

Data Weave supports conditional key value pairs.

Look at this documentation https://docs.mulesoft.com/mule-user-guide/v/3.8/dataweave-types#conditional-elements-2

0
votes

In my case, I have column names separate from column values.

<results>
  <meta-data>
    <column-label>X1</column-label>
    <column-label>X2</column-label>
  </meta-data>
  <data>
    <column-value>Y1</column-value>
    <column-value>Y2</column-value>
  </data>
</results>

The following dwl layout worked:

%dw 1.0
%output application/json
---
using (y= payload.results)
y.data map using (x= payload.results.meta-data[$$]) {
  (x): $
}
0
votes

For Dynamic key:value pair mapping mapobject is the only way.

Please read below link for more information related to mapobject

https://docs.mulesoft.com/mule-user-guide/v/3.8/dataweave-operators#map-object

-2
votes

It seems like DataWeave is unable to do this from my experiments. I did get it to work using a Python scripting transformer. Here is the XML that will do this translation properly:

<scripting:transformer doc:name="Python">
<scripting:script engine="jython">
<![CDATA[
    map = {}
    while (payload.hasNext()):
        next = payload.next()
        map[next['X']] = next['Y']
    result = map
]]>
</scripting:script>
</scripting:transformer>
-2
votes

The simplest way is (payload01.Notification.dynamicProperties map (payload02, indexofPayload02) -> { (payload02.name) : payload02.value })