如何定义适用于数组和值的 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:
描述 我正在处理一个需要 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: