Jolt 生成空值作为转换输出并且无法删除

Jolt generates null values as transformation output and can't be removed

我有这个 JSON 作为输入:

{
  "BusinessInfo": {
    "MemberInformation": {
      "Item": [
        {
          "Relation": {
            "Item": [
              {
                "Partner1": "0072938063",
                "Partner2": "0072938064",
                "CategoryId": "BUR001"
              },
              {
                "Partner1": "0072938063",
                "Partner2": "0072937669",
                "CategoryId": "ZCRM06"
              },
              {
                "Partner1": "0072938063",
                "Partner2": "3000011685",
                "CategoryId": "ZCRM06"
              },
              {
                "Partner1": "1020002423",
                "Partner2": "0072938063",
                "CategoryId": "ZCRM01"
              },
              {
                "Partner1": "0072938067",
                "Partner2": "0072938063",
                "CategoryId": "ZCRM04"
              },
              {
                "Partner1": "0072938063",
                "Partner2": "0072937669",
                "CategoryId": "ZCRM04"
              },
              {
                "Partner1": "0072938063",
                "Partner2": "0072938065",
                "CategoryId": "ZCRM04"
              }
            ]
          }
        }
      ]
    }
  }
}

而这个 Jolt 规格:

[
  {
    "operation": "shift",
    "spec": {
      "BusinessInfo": {
        "MemberInformation": {
          "Item": {
            "*": {
              "Relation": {
                "Item": {
                  "*": {
                    "CategoryId": {
                      "ZCRM04": {
                        "@(2,Partner1)": "[&3].Partner1",
                        "@(2,Partner2)": "[&3].Partner2"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
]

结果是:

[ null, null, null, null, {
  "Partner1" : "0072938067",
  "Partner2" : "0072938063"
}, {
  "Partner1" : "0072938063",
  "Partner2" : "0072937669"
}, {
  "Partner1" : "0072938063",
  "Partner2" : "0072938065"
} ]

问题出在生成的空值上。我需要相同的结果但没有它们。我尝试删除它们,将此操作添加到规范中:

  {
    "operation": "default",
    "spec": {
      "*": "TRASH"
    }
  },
  {
    "operation": "remove",
    "spec": {
      "TRASH": ""
    }
  }

但是不行,结果差不多,只是现在出现的不是null "TRASH":

[ "TRASH", "TRASH", "TRASH", "TRASH", {
  "Partner1" : "0072938067",
  "Partner2" : "0072938063"
}, {
  "Partner1" : "0072938063",
  "Partner2" : "0072937669"
}, {
  "Partner1" : "0072938063",
  "Partner2" : "0072938065"
} ]

有什么问题吗?在第一个转换中或在接下来的两个操作中添加。有没有可能从第一次转换就避免这种情况?

您的输出数组中有空值的原因是因为您的输入 "Item" 数组中有 7 个元素。您正在使用这 7 个数组索引来确定您的输出数组。

特别是这些行

"Item": {
  "*": {
    "CategoryId": {
      "ZCRM04": {
        "@(2,Partner1)": "[&3].Partner1",
        "@(2,Partner2)": "[&3].Partner2"

你在你的示例输入数据中,"ZCRM04" 是 Item 数组元素 5、6、7 中的 CategoryId。

所以前 0 到 4 个元素不匹配,但元素 5 匹配,规范说将数据从“@(2,Partner1)”复制到输出数组的第 5 个索引。

"[&3].Partner1"  -->  "[5].Partner1"  

所以在这种情况下,shift 将生成一个包含 6 个元素的输出数组,其中元素 0 到 4 为空。

使用 Jolt,如果您想要 "filter" 数组元素和 modify/change 这些数组元素的内容,您需要执行两个步骤。

规格

[
  {
    "operation": "shift",
    "spec": {
      "BusinessInfo": {
        "MemberInformation": {
          "Item": {
            "*": {
              "Relation": {
                "Item": {
                  "*": {
                    "CategoryId": {
                      "ZCRM04": {
                        // in this first shift
                        //  just "identify" all the 
                        //  Item entries needs
                        "@2": "temp[]"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "temp": {
        "*": {
          // now for each original "Item" 
          //  "fix" it.
          // In this case only pass thru 
          //  Partner1 and 2
          "Partner1": "[&1].Partner1",
          "Partner2": "[&1].Partner2"
        }
      }
    }
  }
]