Jolt transform a default value dependent on another field
Jolt is a JSON to JSON transformation library where the transform is defined in JSON
Sometimes you need to add a default value along with a data transformation. The straight forward way to do this is to define a “shift” operation to handle the data movement and a “default” operation to handle the default value. For example if I want to copy the “state” field into the “value” field of a “region” object with a “type” of “STATE” the Jolt transform would look like this
Transform[ { "operation": "shift", "spec": { "state": "region.value" } }, { "operation": "default", "spec": { "region": { "type": "STATE" } } } ]
{ "state": "Nebraska" }
{ "region": { "value": "Nebraska", "type": "STATE" } }
This works, however there is an issue if we don’t send a state value the default still gets applied. So our output looks like this.
Blank State Output{ "region": { "type": "STATE" } }
Fortunately we can solve this issue by defining a block of transform for the “state” field instead of just a just mapping to “region.value”. First we use “@(1, state)” –go up a level and get the state field– to map to the “region.value” and then we use “#STATE” –literal string STATE– to map to “region.type”
Fixed Transform[ { "operation": "shift", "spec": { "state": { "@(1,state)": "region.value", "#STATE": "region.type" } } } ]
This will solve our problem and only apply a type if there is a state field. In fact we could take this a step further and handle a province field as well.
State/Providence Transform[ { "operation": "shift", "spec": { "state": { "@(1,state)": "region.value", "#STATE": "region.type" }, "province": { "@(1,province)": "region.value", "#PROVINCE": "region.type" } } } ]
See full code example with test at https://github.com/scottbock/Jolt