在将对象的字符串转换为整数时在 Jolt 中进行空检查

Null Check in Jolt while converting string to integer For an Object

我在 jolt 规范中将字符串转换为 integer/double。如果请求中没有元素,则响应为空对象。相反,我不想将该对象本身作为空对象传递。

输入请求工作:

{
  "data": {
    "first": "1",
    "second": "2"
  }
}

颠簸规格:

[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "first": "datas.firstTag",
        "second": "datas.second.secondTag"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "datas": {
        "firstTag": "=toInteger",
        "second": {
          "secondTag": "=toInteger"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=recursivelySquashNulls"
    }
  }
]

如果请求中有标签则输出:

{
  "datas" : {
    "firstTag" : 1,
    "second" : {
      "secondTag" : 2
    }
  }
}

但是当输入请求如下所示时,我没有得到第二个标签:

{
  "data": {
    "first": "1"
  }
}

当前输出:

{
  "datas" : {
    "firstTag" : 1,
    "second" : { }
  }
}

将第二个对象设为空

"second" : { }

预期输出:

{
  "datas" : {
    "firstTag" : 1
  }
}

请帮助解决这个问题。

通过使用

等符号占位符以动态方式重新思考
[
  {
    "operation": "shift",
    "spec": {
      "*": { 
        "first": "&1s.&Tag",
        "*": { "@(1,&)": "&2s.&.&Tag" }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "firstTag": "=toInteger",
        "*": {
          "*": "=toInteger"
        }
      }
    }
  }
]

这些&符号的后缀整数表示要上升以获取所需值的级别,例如 &1&2 代表 data,&不带整数后缀表示从当前级别开始的值

"*" 通配符表示其余元素,除了 first 在这种情况下(您可能有 third, fourth ...作为其他要格式化的元素,如 the second)

第一种情况

第二种情况

Edit : 对于编辑中提到的当前案例,为了得到

{
  "datas" : {
    "firstTag" : "1",
    "second" : {
      "secondTag" : "2",
      "secondNew" : "3"
    }
  }
}

来自输入

{
  "data": {
    "first": "1",
    "second": "2",
    "secondNew": "3"
  }
}

其中有一个新条目 "secondNew": "3",您需要在规范中明确写入每个键,例如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "first": "&1s.&Tag",
        "second": "&1s.&.&Tag",
        "secondNew": "&1s.second.&"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "firstTag": "=toInteger",
        "*": {
          "*": "=toInteger"
        }
      }
    }
  }
]

为了合并公共对象下的其余元素。