Forum Discussion

swright's avatar
swright
New Contributor III
5 years ago

How to get only one of two items returned

In a mapper snap, my current expression is:
$[‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[‘$’]

I only want the second value “123109” returned as a string. How can I do this? Thanks!

10 Replies

  • Supratim's avatar
    Supratim
    Contributor III

    @swright array[1] , it will give you 2nd value. for your case it looks like-

    [‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[‘$’][1]
    or
    [‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[1]

    • swright's avatar
      swright
      New Contributor III

      I had tried these before and I think that they should have worked but they didn’t.

      The first one changed the values to 1 and 2 which isn’t what I want:

      $[‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[‘$’][1]

      The second one failed with:

      reason":

      “‘1’ was not found while evaluating the sub-expression ‘$[‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[1]’”

      I also tried the following that failed:

      $[‘env:Envelope’][‘env:Body’][‘ns0:uploadFileToUcmResponse’].result[‘$’].pop()

      It failed with:

      "String type does not have a method named: pop, found in: …sult[‘$’].pop().

      Thanks,

      Scott

    • swright's avatar
      swright
      New Contributor III

      I attached a copy of the json.

      I am currently using a fix for the issue in which I use a filter snap after the mapper. It works, but I think that I should be able to select from the values in the mapper and not have to use the filter. Although it looked to me like an array, it seems to be a string which is why many of the things I tried didn’t work.

      Thanks,

      Scott

      (Attachment Copy_output0.json is missing)

      • ptaylor's avatar
        ptaylor
        Employee

        You are dealing with 2 separate input documents. The Mapper gets these one-by-one, not both of them at once.

        Assuming the Mapper’s input is coming from a Json Parser, you can deal with this by unchecking “Process array” in the Json Parser settings. Then the Mapper will receive a single document whose root is an array. Then your expression would look like this:

        jsonPath($, "$[*]['env:Envelope']['env:Body']['ns0:uploadFileToUcmResponse'].result['$']")[1]

        Another approach is to filter the Mapper’s input so that you’re only getting the second document. To do that, insert a Head snap with an offset of 1.