如何将对象添加到Jolt转换规范中的Json

p5fdfcr1  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(107)

在nifi中,我尝试转换一个JSON,它的键数量是可变的,但是总是有一个“date”键。我想转换JSON,把日期的字符串值转换成一个json对象。但是我没有得到我需要的。我可以使用哪个操作/规范来完成预期的输出。输入:

{
  "name": "val1",
  "date": "2021-05-19T00:53:20+00:00"
}

质量标准:

[
  {
    "operation": "shift",
    "spec": {
      "@0": "wrapper"
    }
  }, {
    "operation": "default",
    "spec": {
      "wrapper": {
        "date": { "$date": "${date_attr}" }
      }
    }
  }
]

期望产量

{
  "wrapper": {
    "name": "val1",
    "date": {"$date": "2021-05-19T00:53:20+00:00"}
  }
}

我得到的

{
  "wrapper": {
    "name": "val1",
    "date": "2021-05-19T00:53:20+00:00"
  }
}
jslywgbw

jslywgbw1#

只需执行一步shift转换沿着$运算符的转义字符(\\)就足以使用,例如

[
  {
    "operation": "shift",
    "spec": {
      "name": "wrapper.name",
      "date": { "@(1,date)": "wrapper.&.\\$date" }
    }
  }
]

这里我们将通过使用**@(1,date)中的第一个参数1向上一级**作为嵌套对象中的参数

Edit:考虑到您只需要覆盖属性date,其他属性保持原样,不需要单独添加,因此使用以下代码,该代码同样只有一步shift转换

[
  {
    "operation": "shift",
    "spec": {
      "*": "wrapper.&",
      "date": { "@(1,date)": "wrapper.&.\\$date" }
    }
  }
]
7kqas0il

7kqas0il2#

default的情况下,如果规范中提到的键在输入json中丢失,那么它就会被添加,否则就不会发生任何更改。这里您试图将节点推到更高的级别,这可以通过创建和分配临时节点来实现。
\\是转义字符。

[
  {
    "operation": "shift",
    "spec": {
      "date": "date1",
      "@0": "."
    }
  },
  {
    "operation": "remove",
    "spec": {
      "date": ""
    }
  }, {
    "operation": "shift",
    "spec": {
      "date1": "wrapper.date.\\$date",
      "@0": "wrapper"
    }
  }, {
    "operation": "remove",
    "spec": {
      "wrapper": {
        "date1": ""
      }
    }
  }
]

相关问题