json - 有 JOLT 文档吗? &、@ 等运算符的含义是什么? (NiFi, JoltTransformJSON)

标签 json apache-nifi jolt

是的!我提出这个问题是为了分享我的知识和问答风格,因为我自己很难找到它:)

感谢https://stackoverflow.com/a/67821482/1561441 (Barbaros Özhan,查看评论)为我指明了正确的方向

最佳答案

答案是:看herehere

如果我错了请纠正我,但是:哇,据我所知,目前 GitHub 上有一个 .java 文件,最后一次提交是在 2017 年,它包含 JOLT 语法官方文档的相关部分。我不得不使用它的语法,因为我正在使用 NiFi 并应用它的 JoltTransformJSON 处理器(因此我的问题中的 SEO 滥用,所以更多的人找到了答案)

以下是从 https://github.com/bazaarvoice/jolt/blob/master/jolt-core/src/main/java/com/bazaarvoice/jolt/Shiftr.java 复制的一些最相关的部分并略作编辑。文档本身更广泛,还显示了示例。

'*' Wildcard

  • Valid only on the LHS ( input JSON keys ) side of a Shiftr Spec
  • The '*' wildcard can be used by itself or to match part of a key.

'&' Wildcard

  • Valid on the LHS (left hand side - input JSON keys) and RHS (output data path)
  • Means, dereference against a "path" to get a value and use that value as if were a literal key.
  • The canonical form of the wildcard is "&(0,0)".
  • The first parameter is where in the input path to look for a value, and the second parameter is which part of the key to use (used with * key).
  • There are syntactic sugar versions of the wildcard, all of the following mean the same thing; Sugar : '&' = '&0' = '&(0)' = '&(0,0)
  • The syntactic sugar versions are nice, as there are a set of data transforms that do not need to use the canonical form, eg if your input data does not have any "prefixed" keys.

'$' Wildcard

  • Valid only on the LHS of the spec.
  • The existence of this wildcard is a reflection of the fact that the "data" of the input JSON, can be both in the "values" and the "keys" of the input JSON
  • The base case operation of Shiftr is to copy input JSON "values", thus we need a way to specify that we want to copy the input JSON "key" instead.
  • Thus '$' specifies that we want to use an input key, or input key derived value, as the data to be placed in the output JSON.
  • '$' has the same syntax as the '&' wildcard, and can be read as, dereference to get a value, and then use that value as the data to be output.
  • There are two cases where this is useful
    1. when a "key" in the input JSON needs to be a "id" value in the output JSON, see the ' "$": "SecondaryRatings.&1.Id" ' example above.
    1. you want to make a list of all the input keys.

'#' Wildcard

  • Valid both on the LHS and RHS, but has different behavior / format on either side.
  • The way to think of it, is that it allows you to specify a "synthentic" value, aka a value not found in the input data.
  • On the RHS of the spec, # is only valid in the the context of an array, like "[#2]".
  • What "[#2]" means is, go up the three levels and ask that node how many matches it has had, and then use that as an index in the arrays.
  • This means that, while Shiftr is doing its parallel tree walk of the input data and the spec, it tracks how many matches it has processed at each level of the spec tree.
  • This useful if you want to take a JSON map and turn it into a JSON array, and you do not care about the order of the array.
  • On the LHS of the spec, # allows you to specify a hard coded String to be place as a value in the output.
  • The initial use-case for this feature was to be able to process a Boolean input value, and if the value is boolean true write out the string "enabled". Note, this was possible before, but it required two Shiftr steps.

'@' Wildcard

  • Valid on both sides of the spec.
  • The basic '@' on the LHS.
  • This wildcard is necessary if you want to put both the input value and the input key somewhere in the output JSON.
  • Thus the '@' wildcard is the mean "copy the value of the data at this level in the tree, to the output".

Advanced '@' sign wildcard

  • The format is lools like "@(3,title)", where "3" means go up the tree 3 levels and then lookup the key "title" and use the value at that key.

关于json - 有 JOLT 文档吗? &、@ 等运算符的含义是什么? (NiFi, JoltTransformJSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67822607/

相关文章:

java - 从一组 POJO 中查找 Json 消息的正确实例

apache-nifi - 尼菲 : Consume Azure Event Hub with an enterprise proxy environment

java - 颠簸条件规范

php - 如何以android的登录形式进行json连接?

带有 Pyramid 对象参数的 jQuery.load() 导致 "No JSON object could be decoded"

json - Jolt 变换使用 NiFi 将 json 内容放入字段中

ssl - 在 NiFi 中启用 TLS

json - 颠簸变换后json对象的排序

java - 如何在 Jolt Transformation 中循环时展平对象数组?

json - jq 在输出中打印字符