How can I insert an array into a specific array element using Jolt

Tags: , , ,



Question/problem

How can I use Jolt to insert an array into a specific object in an array?

input

The objects have a common set of attributes, but support optional attributes.

Specific objects need to get these optional attributes depending on their specific position in the array, i.e. second ([1]). These optional attributes are to be added as part of the jolt transformation.

{
  "array" : [
   {
     "key" : "a key",
     "value" : "a value"
   },
   {
     "key" : "another key",
     "value" : "another value"
   }
  ]
}

expected

{
  "array" : [
   {
     "key" : "a key",
     "value" : "a value"
   },
   {
     "key" : "another key",
     "value" : "another value",
     "values": ["extra value1", "extra value2"]
   }
  ]
}

What has been tried

I’ve tried default, modify-default-beta, and modify-overwrite-beta and none seem to behave the way I thought they did.

default

Seems like default ignores the array reference "[1]" so tried the beta operations which seem to support this.

default spec

[
  {
    "operation": "default",
    "spec": {
      "array": {
        "[1]": {
          "values": ["extra value1", "extra value2"]
        }
      }
    }
  }
]

default actual

{
  "array" : [ {
    "key" : "a key",
    "value" : "a value"
  }, {
    "key" : "another key",
    "value" : "another value"
  } ]
}

modify-default-beta

Resolves the array reference "[1]", but only applies the first element in the array from the spec and not the whole array

modify-default-beta spec

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "array": {
        "[1]": {
          "values": ["extra value1", "extra value2"]
        }
      }
    }
  }
]

modify-default-beta actual

{
  "array" : [ {
    "key" : "a key",
    "value" : "a value"
  }, {
    "key" : "another key",
    "value" : "another value",
    "values" : "extra value1" // array is dumped
  } ]
}

modify-overwrite-beta

Tried modify-overwrite-beta and I get the same behaviour as modify-default-beta.

modify-overwrite-beta spec

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "array": {
        "[1]": {
          "values": ["extra value1", "extra value2"]
        }
      }
    }
  }
]

modify-overwrite-beta actual

{
  "array" : [ {
    "key" : "a key",
    "value" : "a value"
  }, {
    "key" : "another key",
    "value" : "another value",
    "values" : "extra value1" // array is dumped
  } ]
}

Interesting side note

Without the array reference on the input this is a fairly easy problem, it seems the behaviour is not what I am expecting when there is an array reference and the *-beta operations.

simple default

I’ve gotten rid of the array from the input

simple default input

{
  "element1": {
    "key": "a key",
    "value": "a value"
  },
  "element2": {
    "key": "a key",
    "value": "another value"
  }
}

simple default spec

[
  {
    "operation": "default",
    "spec": {
      "element2": {
        "values": ["extra value1", "extra value2"]
      }
    }
  }
]

simple default actual

{
  "element1" : {
    "key" : "a key",
    "value" : "a value"
  },
  "element2" : {
    "key" : "another key",
    "value" : "another value",
    "values" : [ "extra value1", "extra value2" ]
  }
}

Answer

This appears to be my misunderstanding of the usage of the spec.

It appears that you don’t insert an array, but each element that you want to insert.

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "array": {
        "[1]": {
          "values": {
            "[0]": "extra value1",
            "[1]": "extra value2"
          }
        }
      }
    }
  }
]

The spec above is inserting both values into the values attribute and specifically into element "[0]" and element "[1]".

This also works with the modify-overwrite-beta operation

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "array": {
        "[1]": {
          "values": {
            "[0]": "extra value1",
            "[1]": "extra value2"
          }
        }
      }
    }
  }
]

the result of both of these specs is as follows:

{
  "array" : [ {
    "key" : "a key",
    "value" : "a value"
  }, {
    "key" : "another key",
    "value" : "another value",
    "values" : [ "extra value1", "extra value2" ]
  } ]
}



Source: stackoverflow