0
votes

My request payload looks something like below:

{
    "AllCodes": [
        {
            "Code1": "ABC"
        },
        {
            "Code2": "TUV"
        },
        {
            "Code3": "XYZ"
        }
    ]
}

I have a function which will replace the values in the above with a certain value. The code that I've now is below:

%dw 1.0
%output application/json
%function LookUp(codes) codes mapObject {($$): $.code} //function to return string values for above codes
%var codeLookup = LookUp(sessionVars.OutputCodes)
%var FinalCodes = payload.AllCodes map codeLookup[$] joinBy ';' 
--
FinalCodes

The output of sessionVars.OutputCodes is:

{
  "CodeMaster": {
    "PrimaryCodes": {
      "PrimarySpecCodes": {
        "ABC": {
          "code": "ABC-String1"
        },
        "TUV": {
          "code": "TUV-String2"
        }
      }
    }
  }
}

The output that I am expecting is:

"ABC-String1;XYZ-String2;XYZ"

As you can see above, since the function is returning the values for only "ABC" and "TUV" codes, my final output should have the original value if no function value found.

I was trying to use a default value before map operator. But it doesn't seem to work.

2
what does sessionVars.OutputCodes look like? - utechtzs
It looks, { "CodeMaster": { "PrimaryCodes": { "PrimarySpecCodes": { "ABC": {"code": "ABC-String1"}, "TUV": {"code": "TUV-String2"} } } } } - Triumph Spitfire

2 Answers

2
votes

We get all the values for allCodes with $ pluck $, then if codes[$] is not found, we default to the value $. I believe you just need to add default $ to your original dataweave for it to work, but I gave a complete solution for other users on StackOverflow.

%dw 1.0
%output application/json
%var outputCodes = 
{
    "CodeMaster": {
        "PrimaryCodes": {
            "PrimarySpecCodes": {
                "ABC": {
                    "code": "ABC-String1"
                },
                "TUV": {
                    "code": "TUV-String2"
                }
            }
        }
    }
}

%var allCodes = 
{
    "AllCodes": [
        {
            "Code1": "ABC"
        },
        {
            "Code2": "TUV"
        },
        {
            "Code3": "XYZ"
        }
    ]
}
%var codes = outputCodes.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
    ($$): $.code
}

---
(flatten (allCodes.AllCodes map ($ pluck $))) map (
    codes[$] default $
) joinBy ';'

this produces:

"ABC-String1;TUV-String2;XYZ"
1
votes

There are various ways to solve this. One could be as follows:

%dw 1.0
%output application/json
%var payload2= { "CodeMaster": { "PrimaryCodes": { "PrimarySpecCodes": { "ABC": {"code": "ABC-String1"}, "TUV": {"code": "TUV-String2"} } } } }

%var codes =  payload2.CodeMaster.PrimaryCodes.PrimarySpecCodes mapObject {
    ($$) : $.code
}
%var finalCodes = (payload.AllCodes map {
    a: $  mapObject {
          a1: codes[$] default $
     }
}.a.a1) joinBy ";"
---
finalCodes