当前位置: 首页 > 知识库问答 >
问题:

JOLT转换,涉及通过属性值链接

能向晨
2023-03-14

我需要使用JOLT将下面的输入JSON转换成下面列出的格式。链接是通过第一个数组元素的deps.name与第二个数组元素的spec.name来完成的。我对链接一无所知。谢谢你的帮助。

输入json

[
  {
    "key": "Primary",
    "metadata": {
      "name": "35f8d9fac891"
    },
    "deps": [
      {
        "name": "e6ae6d29edf8"
      }
    ],
    "spec": {
      "vattr1": "vval1",
      "vattr2": "vval2"
    }
  },
  {
    "key": "Secondary",
    "metadata": {
      "name": "hp74z"
    },
    "spec": {
      "name": "e6ae6d29edf8",
      "nattr1": "nval1",
      "nattr2": "nval2",
      "deps": {
        "Name": "5505da219463"
      }
    }
  }
]

预期的输出格式

{
  "key": "Primary",
  "metadata": {
    "name": "35f8d9fac891"
  },
  "deps": [
    {
      "name": {
        "key": "Secondary",
        "metadata": {
          "name": "hp74z"
        },
        "spec": {
          "name": "e6ae6d29edf8",
          "nattr1": "nval1",
          "nattr2": "nval2",
          "deps": {
            "Name": "5505da219463"
          }
        }
      }
    }
  ],
  "spec": {
    "vattr1": "vval1",
    "vattr2": "vval2"
  }
}

共有1个答案

韩飞翮
2023-03-14

从这个规范开始,以查看数组中的这两个对象是否要在一个新数组中累积,该数组中的键是否具有公共名称(“e6ae6d29edf8”),例如

{
  "operation": "shift",
  "spec": {
    "*": {
      "@(0)": "@(1,spec.name)",
      "@": "@(1,deps[&].name)"
    }
  }
}

如果这些名称(一个来自spec.name,另一个来自deps[],测试将失败。名字)不匹配(就试试吧!)

然后使用

{
  "operation": "shift",
  "spec": {
    "*": {
      "*": "common"
    }
  }
}

为了通过将其转换为“通用”来摆脱令人困惑的键名(“e6ae6d29edf8”)。现在,我们得到两个对象的数组,需要用第二个对象替换“deps”数组的值。修改转换规范旨在进行此类操作。然后,使用移位转换规范只选择“通用”对象。

因此,完整的规格将是:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@(0)": "@(1,spec.name)",
        "@": "@(1,deps[&].name)"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": "common"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=firstElement(@(1,&))",
      "SecondaryObject": "=lastElement(@(1,common))"
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "common": {
        "deps": {
          "*": "=(@(3,SecondaryObject))"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "common": {
        "*": "&"
      }
    }
  }
]

http://jolt-demo.appspot.com/网站上的演示是

编辑(考虑到存在多个要嵌入的注释对象):

然后,您可以在第一个规范中确定一个属性"name_val",用作即将到来的规范中使用的公共标识符值,例如

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@(0)": "@(1,spec.name)",
        "@": "@(1,deps[&].name)",
        "@(0,deps[&].name)": "name_val"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "@(2,name_val)": {
            "@1": "common[&2]"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "common": {
        "0": "c1",
        "*": "c2"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "c1": {
        "deps": {
          "*": {
            "*": "=(@(4,c2))"
          }
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "c1": ""
    }
  }
]
 类似资料:
  • 我正在尝试使用 Jolt 转换来转换 Json,在这里寻找一些输入。我正在尝试过滤一个键,该键是另一个属性的值。这是我的输入和预期输出 我看到的输出是 我试过的规格是 但是我没有得到预期的输出。我也尝试了一些其他组合,但未能获得正确的输出。有人能帮忙吗?

  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我正在尝试根据属性值进行过滤。 我的目标是获得一个数组,其中只包含动作为“remove”的项目。 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图通过属性的内部值进行过滤。 我的目标是得到一个数组,它只包含类型为“xx”的项目。但不是所有的项目对象,只有一些字段 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

  • 我正在尝试使用Jolt transformation转换一个JSON,在这里寻找一些输入。我试图通过属性的内部值进行过滤。 我的目标是获得一个只包含类型名为' xx '的项目的数组。 这是我的输入和预期输出: 输入: 预期产出: 你能帮我写一个简单的规范吗?

  • 我有以下输入,我想通过 jolt 处理器转换预期输出中的数据 输入 预期产量 我们有包含属性的数据,数组包含一对数据,我想把这对数据转换成键和值

  • 我想转换这个JSON: 对此JSON: 我目前正在使用该规范,但它不适合我: 有人能给出一个规范吗?有没有关于jolt JSON的明确文档 ................................................................................................................................