如何定义适用于数组和值的 Jolt 规范

How to define a Jolt spec that will work for both array and value

描述 我正在处理一个需要 JSON 到 JSON 转换的问题,所以我为此使用了 Jolt 库。我的输入 JSON 文档中有一些节点有时会作为对象数组出现,有时会作为普通对象出现。我无法定义适用于对象数组和单个对象的 Jolt 规范。

需求如果节点包含对象数组,则从数组中取出第0个元素并将其映射到输出JSON.

震动规格

[
  {
    "operation": "cardinality",
    "spec": {
      "patient": {
        "@": "ONE",
        "*": "ONE"
      }
    }
    },
  {
    "operation": "shift",
    "spec": {
      "patient": {
        "dateOfBirth": "patient.dateOfBirth",
        "firstName": "patient.firstName",
        "lastName": "patient.lastName"
      }
    }
  }
]

输入 JSON(JSON 规格适用于此输入)

{
  "patient": [
    {
      "dateOfBirth": [
        "19890101",
        "19890101"
      ],
      "firstName": "Test",
      "lastName": "Test"
    },
    {
      "dateOfBirth": [
        "19890101",
        "19890101"
      ],
      "firstName": "Test",
      "lastName": "Test"
    }
  ]
}

输出JSON(得到预期的输出)

{
  "patient" : {
    "dateOfBirth" : "19890101",
    "firstName" : "Test",
    "lastName" : "Test"
  }
}

但是当患者不是以数组的形式出现而是以单个对象的形式出现时,定义的震动规范就不再起作用了。

输入 JSON(JSON 规格不适用于此输入)

{
  "patient": {
    "dateOfBirth": [
      "19890101",
      "19890101"
    ],
    "genderCode": "1",
    "firstName": "Test",
    "lastName": "Test"
  }
}

实际输出(不正确)

{
  "patient" : {
    "dateOfBirth" : [ "19890101", "19890101" ],
    "firstName" : "Test",
    "lastName" : "Test"
  }
}

预期输出

{
  "patient" : {
    "dateOfBirth" : "19890101",
    "firstName" : "Test",
    "lastName" : "Test"
  }
}

可以通过modify-beta变换判断patient是否为数组。在这种情况下,我在该转换中使用了 firstElement 函数。然后,使用条件逻辑如

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "isArray": ["=firstElement(@(1,patient))", "No"]
    }
  },
  {
    "operation": "shift",
    "spec": {
      "@(0,isArray)": {
        "No": { "@(2,patient)": "patient" },
        "*": { "@": "patient.&" }
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "*": {
        "*": "ONE"
      }
    }
  }
]

如果不需要属性"genderCode",则添加一个额外的移除转换如

,
  {
    "operation": "remove",
    "spec": {
      "*": {
        "genderCode": ""
      }
    }
  }

演示 1:

演示 2: