如何在颠簸中保持空值的条件?

时间:2018-11-21 07:01:22

标签: json transformation jolt

输入:

 { 
   "itemName": null,
   "itemNumber": 22
 }

输出:

 {
   "isItemNameNull": true,
   "itemNumber": 22
 }

如果该值为null,则不应该将其映射,而是将'isItemNameNull'映射为true,

SPEC:

[
 {
"operation": "shift",
"spec": {
  "itemName": {
    "null": {
      "true": "isItemNameNull"
    },
    "": {
      "#TRASH": "TRASH"
    },
    "*": {
      "@(2,itemName)": "itemName"
    }
  },
  "itemNumber": {
    "null": {
      "#TRASH": "TRASH"
    },
    "": {
      "#TRASH": "TRASH"
    },
    "*": {
      "@(2,itemNumber)": "itemNumber"
    }
  }
  }
 }
]

我映射了该标志,但是它没有从空状态中获取它。任何人都可以请我帮忙。谢谢。

3 个答案:

答案 0 :(得分:0)

没有一个很好的方法。

答案 1 :(得分:0)

我尝试过这种情况。我也在您的输入json中进行了一些编辑。

Input Json
----------
{
  "itemName": "null",
  "itemNumber": 22
}


SPEC:
----
    [
      {
        "operation": "shift",
        "spec": {
          "itemName": {
            "null": {
              "#true": "isItemNameNull"
            }
          },
          "itemNumber": "itemNumber"
        }
       }
    ]

Output Json
-----------

{
  "isItemNameNull" : "true",
  "itemNumber" : 22
}

请尝试一下

答案 2 :(得分:0)

您可以通过结合使用默认和移位操作来实现这一点。

首先使用一个默认值来检测 itemName 是否为 null 并为其分配一个默认值 true

然后使用移位来适当地处理 itemName

  • 如果 itemNametrue(即默认设置,因为其原始值为 null),则使用 isItemNameNull 的值设置 itemName
  • else 将 itemName 复制到输出中(我假设您想这样做,否则只需保留第二位)
[
  {
    "operation": "default",
    "spec": {
      "itemName": true
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "itemName": {
        "true": {
          "@1": "isItemNameNull"
        },
        "*": {
          "@1": "itemName"
        }
      }
    }
  }
]

一个警告是,如果输入有一个字符串 "true" 表示 itemName

{
  "itemName": "true",
  "itemNumber": 22
}
  

那么输出将是

{
  "isItemNameNull": "true",
  "itemNumber": 22
}

所以不是万无一失!

要绕过该陷阱,您可以使用 3 步方法:

  • 如果 itemName 为空,则为其分配适当的默认“标记”值
  • 处理 itemName 并且如果它具有“标记”值,则将 isItemNameNull 设置为字符串值“true”
  • isItemNameNull 转换为布尔值
[
  {
    "operation": "default",
    "spec": {
      "itemName": "null_marker"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "itemName": {
        "null_marker": {
          "#true" :"isItemNameNull"
        },
        "*": {
          "@1": "itemName"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "isItemNameNull": "=toBoolean"
    }
  }
]