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

JOLT 转换:从多个 JSON 数组中提取字段并将其合并到单个数组输出

黄靖
2023-03-14

我的JSON对象:

{
  "questionResponses": [
    {
      "responses": [
        {
          "responseId": "1",
          "response": "response 1"
        },
        {
          "responseId": "2",
          "response": "response 2"
        },
        {
          "responseId": "3",
          "response": "response 3"
        }
      ]
    }
  ],
  "answers": [
    {
      "questionId": "1",
      "answerId": "answer 1"
    },
    {
      "questionId": "1",
      "answerId": "answer 2"
    }
  ],
  "totalAttachments": 0
}

我需要以下格式的输出:

json prettyprint-override">[
  {
    "response": "response 1",
    "answerId": "answer 1"
  },
  {
    "response": "response 1",
    "answerId": "answer 2"
  },
  {
    "response": "response 2",
    "answerId": "answer 1"
  },
  {
    "response": "response 2",
    "answerId": "answer 2"
  },
  {
    "response": "response 3",
    "answerId": "answer 1"
  },
  {
    "response": "response 3",
    "answerId": "answer 2"
  }
]

我只有一个从两个数组中获取字段的解决方案,但是不确定如何在没有任何公共键的情况下连接它们,并以所需的方式表示它们

当前JOLT规格:

[
  {
    "operation": "shift",
    "spec": {
      "questionResponses": {
        "*": {
          "responses": {
            "*": {
              "response": "responses.[&1].response"
            }
          }
        }
      },
      "answers": {
        "*": {
          "answerId": "answers.[&1].answerId"
        }
      }
    }
  }
]

当前不希望的输出:

{
  "responses": [
    {
      "response": "response 1"
    },
    {
      "response": "response 2"
    },
    {
      "response": "response 3"
    }
  ],
  "answers": [
    {
      "answerId": "answer 1"
    },
    {
      "answerId": "answer 2"
    }
  ]
}

现在我必须将这些响应与每个answerId结合起来,以获得所需的输出。

此外,我使用Apache Nifi作为解决方案,如果JOLT transform不像预期的那样工作,我们可以使用其他方法/处理器吗?

共有1个答案

漆雕誉
2023-03-14

您可以使用递归移位转换,首先在answers数组下获取键值对,然后浏览responses数组的子属性,例如

[
  {
    "operation": "shift",
    "spec": {
      "questionR*": {
        "*": {
          "responses": {
            "*": {
              "@(4,answers)": "@(1,response)"
            }
          }
        }
      }
    }
  },
  { 
   // Determine two independent arrays both with size of 6
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "$1": "response",
          "a*": "&"
        }
      }
    }
  },
  {
   // expand those arrays as objects which contain desired key-value pairs
    "operation": "shift",
    "spec": {
      "*": {
        "*": "&.&1"
      }
    }
  },
  {
   // get rid of object labels
    "operation": "shift",
    "spec": {
      "*": ""
    }
  }
]
 类似资料:
  • 如何在Jolt转换JSON数组中保留其他字段,我正在尝试使用通配符,但在最终输出中没有添加字段? 这是我正在使用的输入示例 我使用了下面的Jolt转换,并尝试了通配符: 下面是我的预期输出,其中发生了移位操作,然后需要保持所有其他字段不变 即将到来的实际输出:

  • 问题内容: 我有两个像 我希望它们合并成单个数组 问题答案: 您需要该方法。

  • 我必须将 JSON 输入转换为包含一个对象的数组。 我有这个 JOLT 配置: 以下是我的意见: 实际产量: 期望的输出: 你知道该怎么做吗? 谢谢你们的帮助

  • 我有一个类似这样的数组: 我想要一个如下所示的结果对象: 我如何在Javascript中实现这一点?

  • 我正在尝试编写一个规范来使用jolt转换进行以下转换。我需要通过保持空值将平面JSON转换为嵌套JSON。我附加了输入、预期输出和jolt转换。我需要在输出中保留空值,但在jolt转换后不会显示在输出中。我的jolt转换没有得到确切的输出。 我在将平面JSON转换为嵌套JSON时遇到了一些问题。我看了一些例子,但没有更进一步了解上面提到的内容。我需要通过使用JOLT规范来转换JSON结构。我用ht

  • 问题内容: 我想更改字节数组中的值以在MSB中放入较长的时间戳值。有人可以告诉我最好的方法是什么。我不想一点一点地插入值,我认为这是非常低效的。 我想要的是这样的: 这样是可能的。在此字节数组中编辑/插入值的最佳方法是什么。由于字节是原始数据,我不认为有一些直接的实现可以利用吗? 编辑: 似乎比快,所以用它替换上面的代码。如果有误,请纠正我。 问题答案: 有多种方法可以做到这一点: 使用(最佳选择