Nifi JOLT:将JSON对象扁平化为JSON对象列表

2jcobegt  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(325)

我正在尝试使用Nifi JOLT处理器将平面JSON对象转换为JSON对象列表,如下面的输出所示。参数"p_7_1_0""px_2_7_1_0""pv_7_1_1"的名称或数字可能不同(例如,我可以使用**{“时间戳”:1559347670,“程序错误_2_1_0”:1,“第2_2_1_0页”:1 }**)
有人能帮我看看震动规格吗?

输入Json

{
  "timestamp": 1559347670,
  "p_7_1_0": 6,
  "px_2_7_1_0": 1,
  "pv_7_1_1": 1
}

预期输出JSON

{
  "values": [
    {
      "key": "p_7_1_0",
      "value": 6,
      "timestamp": 1559347670
    },
    {
      "key": "px_2_7_1_0",
      "value": 1,
      "timestamp": 1559347670
    },
    {
      "key": "pv_7_1_1",
      "value": 1,
      "timestamp": 1559347670
    }
  ]
}

先谢了

vxbzzdmp

vxbzzdmp1#

在阅读了这个问题之后,通过JOLT转换沿着数组复制单个值
答案是https://stackoverflow.com/a/50438480/2733184
我看得出来,你们想要的东西出奇地相似。然而,我绝不会一针见血地提出需要问的问题。
我鼓励你去前面提到的Q和A,阅读所有的内容(包括规范中的评论),并给予他们一些赞成票。

[
  {
    "operation": "shift",
    "spec": {
      "timestamp": "timestamp",
      // put everything but the timestamp in a member (the pivot)
      "*": "all.&"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "all": {
        "*": {
          // grab the member key and put it in its final place
          "$": "values[#2].key",
          // grab the member value and put it in its final place
          "@": "values[#2].value",
          // Walk back two steps (* -> all -> root) and grab the timestamp
          "@(2,timestamp)": "values[#2].timestamp"
          // I wish I understood the logic behind "#2" but I don't
          // and I'll have to read on it further
        }
      }
    }
  }
]

我希望有人能解释一下#是干什么用的,我的第一React是它像&(成员名称),但看起来像是成员位置(?)。

oalqel3c

oalqel3c2#

您可以循环遍历具有**_字符的属性,以区别于单个shift转换规范中的timestamp**,例如

[
  {
    "operation": "shift",
    "spec": {
      "*_*": {
        "@1,timestamp": "values[#2].timestamp",
        "$": "values[#2].key",
        "@": "values[#2].value"
      }
    }
  }
]

其中

***"@1,timestamp"**表示在树中向上一级后获取时间戳属性的值

  • 按**[#2]在右侧将在逻辑上表示遍历:{合计2个级别以到达最顶层属性的级别,而[# ]**将生成数组形式的结果

相关问题