Home > Enterprise >  Unexpected null elements in output array
Unexpected null elements in output array

Time:11-09

Consider the following input JSON:

{
  "widgets": [
    {
      "type": "FOO",
      "id": "F1"
    },
    {
      "type": "ZAP",
      "id": "Z1"
    },
    {
      "type": "BAR",
      "id": "B1"
    }
  ]
}

The following transformation:

[
  {
    "operation": "shift",
    "spec": {
      "widgets": {
        "*": {
          "type": {
            "FOO": {
              "@(2,id)": "widgets[&3].fooId"
            },
            "BAR": {
              "@(2,id)": "widgets[&3].barId"
            }
          }
        }
      }
    }
  }
]

creates the expected (correct) output:

{
  "widgets": [
    {
      "fooId": "F1"
    },
    null,
    {
      "barId": "B1"
    }
  ]
}

However the following transformation creates the unexpected output:

[
  {
    "operation": "shift",
    "spec": {
      "widgets": {
        "*": {
          "type": {
            "BAR": {
              "@(2,id)": "widgets[&3].barId"
            }
          }
        }
      }
    }
  }
]

This is the actual (wrong) output:

{
  "widgets": [
    null,
    null,
    {
      "barId": "B1"
    }
  ]
}

This is the expected (correct) output:

{
  "widgets": [
    {
      "barId": "B1"
    }
  ]
}

Why sometimes there is null elements in the widgets array and sometimes there is not? How I can avoid them?

Based on the many other SO questions the following operation:

{
  "operation": "modify-overwrite-beta",
  "spec": {
    "*": "=recursivelySquashNulls"
  }
}

should remove the null values, but why those are not removed in the following transformation?

[
  {
    "operation": "shift",
    "spec": {
      "widgets": {
        "*": {
          "type": {
            "BAR": {
              "@(2,id)": "widgets[&3].barId"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=recursivelySquashNulls"
    }
  }
]

I'm observing this behavior in enter image description here

CodePudding user response:

The first output keeps null as well(I don't know if it should appear in the desired output). Since the index(which is 1) of the object having "type": "ZAP" stays in the middle of the indexes(0,1,2), but not at the end, then doesn't vanish at that level.

Btw, squashNulls especially no impact for the objects nested within array. Indeed, it has some bugs and documented as fixed for version 0.1.6.

You can rather use the following spec which doesn't have square-bracketed indexes such as

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "type": {
            "FOO|BAR": {
              "@(2,id)": "&4.&1.&1Id"
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "@": "&2[]"
        }
      }
    }
  }
]
  • Related