skip to Main Content

I want to write a JOLT definition that loops through each object in my data array, and move the object to the "found" array if the key "parent_id" is present, but otherwise, if the "parent_id" key is not present, move the entire current object to the "notfound" array.

Example input:

{
  "data": [
    {
      "ID1": "ID1",
      "ID2": "123"
    },
    {
      "parent_id": "xyz",
      "ID1": "ID1",
      "ID2": "123"
    }
  ]
}

Expected output:

{
  "notfound": [
    {
      "ID1": "ID1",
      "ID2": "123"
    }
  ],
  "found": [
    {
      "parent_id": "xyz",
      "ID1": "ID1",
      "ID2": "123"
    }
  ]
}

I’ve tried my hand at making the JOLT definition, but everything i’ve tried hasn’t really worked. Any help here would be greatly appreciated!

2

Answers


  1. You can use the following spec

    [
      {// for the existence of the attribute
        "operation": "modify-overwrite-beta",
        "spec": {
          "data": {
            "*": {
              "parent_id": ["=toString", "notfound"] // If the attribute doesn't exist, then the converson doesn't occur and fill in default value as "notfound". Our aim is not string conersion, bu just an existence check through a suitable function. 
            }
          }
        }
      },
      {
        "operation": "shift",
        "spec": {
          "data": {
            "*": {
              "parent_id": {
                "notfound": {
                  "@2": "&[]"
                },
                "*": { //else case, eg. found
                  "@2": "found[]"
                }
              }
            }
          }
        }
      },
      {
        "operation": "remove",
        "spec": {
          "notfound": {
            "*": {
              "parent_id": ""
            }
          }
        }
      }
    ]
    

    where conditional logic is used after determining the attribute with notfound case, and then get rid of that extra "notfound" parent_id.

    the demo on the site http://jolt-demo.appspot.com/ is

    enter image description here

    Login or Signup to reply.
  2. You can use this spec:

    First, create a temp variable with the default notfound value.

    So if you see any parent_id in the objects, You can add a new value found to the temp variable.

    If parent_id had any value the temp value looks like this: ["found", "notfound"] and You should always pick the first element.

    And in the last spec, We create the final object with parent_id or without it.

    [
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "temp": "notfound"
        }
      },
      {
        "operation": "shift",
        "spec": {
          "temp": "&",
          "*": {
            "*": {
              "*": "&2[&1].&",
              "parent_id": {
                "@": "parent_id",
                "#found": "temp"
              }
            }
          }
        }
      },
      {
        "operation": "modify-overwrite-beta",
        "spec": {
          "temp": "=firstElement"
        }
      },
      {
        "operation": "shift",
        "spec": {
          "temp": {
            "found": {
              "@(3,data[0])": "&1[0]",
              "@(3,parent_id)": "&1[0].parent_id"
            },
            "notfound": {
              "@(3,data[0])": "&1[0]"
            }
          }
        }
      }
    ]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search