Search code examples
mulemule-componentanypoint-studiodataweavemule-esb

Mule Dataweave Replace Null with Specific Value


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.


Solution

  • 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"