json - Jolt 变换 - 如何用字段值重命名字段?

标签 json apache-nifi jolt

我想知道是否有任何方法可以通过使用 JOLT 转换将 JSON 属性的值连接到现有属性名称来重命名该字段。

假设我们在这里输入:

{
  "auth_id": "0000-0000-0000",
  "read_time": "2022-01-10T00:00:00.0",
  "src_name": "REQ-A001",
  "reading_a": "150.18",
  "reading_b": "12.10",
  "reading_c": "3.00",
  "note": 1
}

我期望的是在所有现有字段名称之前连接来自 auth_idread_time 的字段值,并使用冒号 (:) 作为分隔符结果将变成:

预期:

{
  "0000-0000-0000:2022-01-10T00:00:00.0:auth_id": "0000-0000-0000-0000-0000",
  "0000-0000-0000:2022-01-10T00:00:00.0:read_time": "2022-01-10T00:00:00.0",
  "0000-0000-0000:2022-01-10T00:00:00.0:src_name": "REQ-A001",
  "0000-0000-0000:2022-01-10T00:00:00.0:reading_a": "150.18",
  "0000-0000-0000:2022-01-10T00:00:00.0:reading_b": "12.10",
  "0000-0000-0000:2022-01-10T00:00:00.0:reading_c": "3.00",
  "0000-0000-0000:2022-01-10T00:00:00.0:note": 1
}

到目前为止我已经提到过

并提出JOLT规范:

[
  {
    "operation": "modify-default-beta",
    "spec": {
      // concatenate field value auth_id and read_time, while using ":" as separator
      "ukey": "=concat(@(1,auth_id),':',@(1,read_time))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        // concatenate field values before field name
        "@": "@(2,ukey):&"
      }
    }
  }
]

但是我得到了这个输出:

{
  "0000-0000-0000:2022-01-10T00:00:00.0": {
    ":auth_id": "0000-0000-0000",
    ":read_time": "2022-01-10T00:00:00.0",
    ":src_name": "REQ-A001",
    ":reading_a": "150.18",
    ":reading_b": "12.10",
    ":reading_c": "3.00",
    ":note": 1
  }
}

我希望在 NifiJoltTransformJSON 处理器中使用 JOLT 规范。

非常感谢任何帮助或指导!

最佳答案

您可以使用这个较短规范:

[
  {
    "operation": "shift",
    "spec": {
      "*": "@(1,auth_id).@(1,read_time).&"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": {
        "*": {
          "*": "&2:&1:&"
        }
      }
    }
  }
]

enter image description here

或者您可以使用另一种方式,如下所示:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "@(2,auth_id)": "keys[#2]",
        "@(2,read_time)": "keys[#2]",
        "$": "keys[#2]",
        "@": "values"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "keys": {
        "*": "=join(':',@0)"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "values": {
        "*": "@(2,keys[#1])"
      }
    }
  }
]

1、Shift操作分别创建

2、修改操作将所有key:连接起来。

3、Shift操作创建我们想要的输出。

注意:请单独运行每个规范以更好地理解此代码。

关于json - Jolt 变换 - 如何用字段值重命名字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75672391/

相关文章:

java - 反序列化 Gson 中的抽象类

javascript - 使用 angularjs forEach 循环

minify - 从 nifi 带参数执行 java 程序

apache-nifi - 如何掌握内容?

arrays - 使用 JSON 数组中另一个值的匹配来提取特定值到 JOLT

json - SWIFT 结构上的泛型

java - Java 中的文本数据转换为 JSON 对象

python - 如何在 NiFi UI 中启用 ExecuteScript 处理器的 "View State"选项?

arrays - 震动 : Make Nested Make a nested array as part of main array

json - 将 JSON 中的整数转换为字符串,Nifi