wmjohnson
wmjohnson

Reputation: 61

Filter Payload with Dataweave for a Set Variable component

For the Mulesoft 4.2 Set Variable component, I want to assign a simple String value pulled from a single specific record from an incoming JSON payload.

In my case, taking just the value from the 'country' field from below example:

[
  {
    "salesID": "4404Bob Builder210032011-02-18T15:52:21+0.00",
    "id": "4404",
    "firstName": "Bob",
    "lastName": "Builder",
    "address": "181 Construction Road, Adelaide, NSW",
    "postal": "21003",
    "country": "New Zealand",
    "creationDate": "2011-02-18T15:52:21+0.00",
    "accountType": "personal",
    "miles": 17469
  }
]

A non-dynamic way to do this is like:

payload[0].country

I believe the best way to do this is with the filter function. The below option gives me the entire object, but I just want the country field.

payload filter ($.id == "4404")

Map function seems to be overkill for this since I only want the value, itself. I must be missing the syntax to get at the country field.

Upvotes: 2

Views: 1102

Answers (2)

wmjohnson
wmjohnson

Reputation: 61

I did some more investigating, and this solution got me close enough to what I wanted: https://stackoverflow.com/a/43488566/11995149

For my code example using filter, I had to surround the whole expression in parenthesis, and then I can access the field with a dot reference, but below code gives String value as a single record within an array:

(payload filter ($.id == "4404")).country
[
  "New Zealand"
]

In my case, I know that just one result will be returned from the filtered payload, so I could get just the String value with:

(payload filter ($.id == "4404"))[0].country

enter image description here

Upvotes: 4

Ashish Kharbanda
Ashish Kharbanda

Reputation: 11

Can you try any of below options:

1) (payload groupBy ((item, index) -> item.id))["4404"][0].country OR 2) (payload map ((item, index) -> if(item.id == "4404") item.country else ""))[0]

Thanks, Ashish

Upvotes: 1

Related Questions