JOLT - 在嵌套数组中加入数组

JOLT - Join arrays in nested array

我正在尝试实现以下转换。但是,我的解决方案将不需要的空值添加到最终数组中。

转换需要为所有 root 元素移动 child 数组中的名称。我创建了 3 个案例来说明问题。

案例一

输入

{
  "root": [
    {
      "child": [
        {
          "name": "John"
        },
        {
          "name": "Frazer"
        }
      ]
    },
    {
      "child": [
        {
          "name": "Brandon"
        },
        {
          "name": "Josef"
        }
      ]
    }
  ]
}

期望的输出

{
  "NAMES": ["John,Frazer","Brandon,Josef"]
}

情况二:一个child为空

输入

{
  "root": [
    {
      "child": []
    },
    {
      "child": [
        {
          "name": "Brandon"
        },
        {
          "name": "Josef"
        }
      ]
    }
  ]
}

期望的输出

{
   "NAMES": ["","Brandon,Josef"]
}

情况 3:所有 child 都是空的

输入

{
  "root": [
    {
      "child": []
    },
    {
      "child": []
    }
  ]
}

期望的输出

{
   "NAMES": ["",""]
}

编辑: root 数组总是至少有 1 个元素。

当前的 JOLT 规范工作正常,但 child 为空数组的情况除外。它生成 null 值,我试图指定一个 空字符串 (或任何硬编码字符串值,例如 "NO_NAMES"

[
  {
    "operation": "shift",
    "spec": {
      "root": {
        "*": {
          "child": {
            "*": {
              "name": "NAMES[&3]"
            }
          }
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "NAMES": {
        "*": "=trim"
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "NAMES": "MANY"
    }
    },
  {
    "operation": "default",
    "spec": {
      "NAMES": []
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "NAMES": {
        "*": "=join(',',@0)"
      }
    }
  }
]

您可以应用连续转换 modify-overwrite-beta 然后 shift 以确定列表的逗号分隔元素( 除非它们的大小为零,这种情况下只会出现双引号),然后将它们连接在一个列表中,例如

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "root": {
        "*": {
          "child": { "*": "@(0,name)" },
          "NAMES": "=join(',',@(1,child))"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "root": {
        "*": {
          "NAMES": "&"
        }
      }
    }
  }
]