2025年NIFI JoltTransFormJson JOLT SPEC的写法

NIFI JoltTransFormJson JOLT SPEC的写法目录 一 jolt 插件介绍 1 jolt 插件使用简介 2 jolt 插件主要转换方法 二 基本通配符说明 通配符 amp 通配符 通配符 通配符 通配符 通配符 三 JOLT SPEC 基本写法总结 1 替换 JSON 中的关键字 2

大家好,我是讯享网,很高兴认识大家。

目录

一、jolt插件介绍

1、jolt插件使用简介:

2、jolt插件主要转换方法

二、基本通配符说明

 “*”通配符

 “&”通配符

 “$”通配符

“#”通配符

“|”通配符

“@”通配符

三、JOLT SPEC基本写法总结

1、替换JSON中的关键字

2、&节点位置输入

3、@#通配符

4、@(,)

5、嵌套转换

6、转义字符

7、利用&取关键值,替换原理,达到加后缀的目的

8、利用@实现分类取值 

9、转换大小写,值类型的转换

10、 “|”通配符

11、去除一个字段:

12、default转换


一、jolt插件介绍

1、jolt插件使用简介:

2、jolt插件主要转换方法

插件提供了5种转换方法:
  - 1、shift:主要作用是拷贝,将输入json的某个结构拷贝到目标json。
  - 2、default:主要作用是设置默认值,如果输入json某个value不存在,则使用默认值补齐。
  - 3、remove:主要作用是删除,可以删除输入json结构的某个结构。
  - 4、sort:对key值进行排序。
  - 5、cardinality:jsonobject和jsonarray之间的切换。
目前主要用Shiftr这个类,java代码如下:

Object input = JsonUtils.classpathToObject("/jolt/Shiftr/sample01/input.json");  // 读取input.json,如果input已经是一个java对象,则可以忽略这步 Object spec = JsonUtils.classpathToObject("/jolt/Shiftr/sample01/spec.json");   // 使用Jolt自带的JsonUtils读取配置的转换规则spec.json作为一个object Shiftr shiftr=new Shiftr(spec);  // 创建shiftr对象,传入转化规则 Object output = shiftr.transform(input);   // 转换input,得到output

讯享网

(NOTE)注:operation取值有shift,default,remove,cardinality,sort,每一种转换的规则作为spec的value。

二、基本通配符说明

 “*”通配符

“*”通配符(仅可以匹配input的key,不能匹配value),使用 “*”通配符的时候,需要保证输入json具有相同的层级结构,它可以匹配某一个层级结构中的所有key,也可以匹配一个key的部分字符。

 “&”通配符

“&”通配符有两个参数&(0,1),第一个参数0表示从input的什么位置去找value,第二个参数1表示将找到的value放在匹配到的哪个位置。参数可以省略,&=&0=&(0)=&(0,0)。

 “$”通配符

$通配符和&通配符具有相同的语法结构,都有两个参数,$通配符通常用法是将当前key值作为output的value使用。

“#”通配符

“#”通配符最有用的一点是,当input取不同值的时候,可以对output进行不同的操作,主要是赋值操作。

“|”通配符

“|”表示“或”的逻辑,很容易理解,它只会匹配写出的字符。

“@”通配符

“@”通配符也有两个参数@(0,1),"@"和"$"用法类似,不过"@"取得是指定位置的value,而“$”取的是指定位置的key。

三、JOLT SPEC基本写法总结

(NOTE)注:我理解JOLT SPEC写法需要抓住几个关键点:匹配;替换,输入; JSON节点的引用;取值(键,值)。

1、替换JSON中的关键字

(NOTE)注:这个例子要理解匹配与替换Json Input:

讯享网{   "rating": {     "primary": {       "value": 3     },     "quality": {       "value": 3     }   } } ``` Jolt Spec: ``` [   {     "operation": "shift",     "spec": {       "rating": {         "primary": {           "value": "Rating"         }       }     }   } ]

Output:

{   "Rating" : 3 }

//说明//
> 1:“规范”节点中内容就是转换JSON的核心方法。
> 2:匹配是按照输入JSON的树结构,父子节点的层次,关键的值进行的比如例子中先匹配了  "rating",然后是 "primary"...
> 3:匹配就是为了替换,首先是节点的替换,比如匹配到了 "rating",而JOLT Spec“rating”后的:{}就替换掉了了这个节点。
> 4:然后是键值的替换,比如 "value":"Rating"所以
>      "value":3 - >"rating":3
>      而"rating":3替换了主要节点,替换了评级节点。
> 5:没有匹配到的就被忽略掉。
> 6:匹配可以使用 “*”,全部匹配。

2、&节点位置输入

Json Input:

讯享网{   "rating": {     "primary": {       "value": "3",       "max": 5     },     "quality": {       "value": 3,       "max": 5     },     "sharpness": {       "value": 7,       "max": 10     }   } }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "rating": {         "primary": {           "value": "Rating",           "max": "RatingRange"         },         "*": {           "max": "SecondaryRatings.&1.Range",           "value": "SecondaryRatings.&1.Value",           "$": "SecondaryRatings.&1.Id"         }       }     }   } ]

Output:

讯享网{   "Rating" : "3",   "RatingRange" : 5,   "SecondaryRatings" : {     "quality" : {       "Id" : "quality",       "Range" : 5,       "Value" : 3     },     "sharpness" : {       "Id" : "sharpness",       "Range" : 10,       "Value" : 7     }   } }

> 1: “*” 匹配等级下,除主(已匹配转换)外其余节点。
> 2:“value”:“SecondaryRatings.&1.Value”,到此,我们大概已经了解,SecondaryRatings.&1.Value是输出json的节点结构,[]表示了层级关系,&1树结构中level0,它的level1是“*”,&1即“*”匹配到的节点键。
> 3:$的作用也是取关键值,当前 “*” 匹配到的节点的关键值,不同与匹配的是, “$” 等不是匹配含义时,作用为输入。

{   "rating": {     "primary": {       "value": 3,       "max": 5     },     "quality": {       "value": 3,       "max": 7     }   } }

Jolt Spec:


讯享网

讯享网[   {     "operation": "shift",     "spec": {       "rating": {         "*": {           "$(1)": "ratingNames[]"         }       }     }   } ]

Output:

{   "ratingNames" : [ "rating", "rating" ] }

3、@#通配符

Json Input:

讯享网{   "rating": {     "primary": 5,     "quality": 4,     "design": 5   } }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "rating": {         "*": {           "$": "Ratings[#2].Name",           "@": "Ratings[#2].Value"         }       }     }   } ]

Output:

讯享网{   "Ratings" : [ {     "Name" : "primary",     "Value" : 5   }, {     "Name" : "quality",     "Value" : 4   }, {     "Name" : "design",     "Value" : 5   } ] }

//说明//
> 1:@是取当前节点值。
> 2:$是取当前节点的关键值。
> 3:#2 :(画节点树去理解,弄清当前#在那个节点,再跳)跳到评分,访问评级节点,统计评分有几个子节点被匹配到了,统计数为数组大小。

{   "rating": {     "primary": 5,     "quality": 4,     "design": 5   } }

Jolt Spec:

讯享网[   {     "operation": "shift",     "spec": {       "rating": {         "*": {           "$": "Ratings[#1].Name",           "@": "Ratings[#1].Value"         }       }     }   } ]

Output:

{   "Ratings" : [ {     "Name" : [ "primary", "quality", "design" ],     "Value" : [ 5, 4, 5 ]   } ] }

4、@(,)

Json Input:

讯享网{   "data": {     "1234": {       "clientId": "12",       "hidden": true     },     "1235": {       "clientId": "35",       "hidden": false     }   } }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "data": {         "*": {           "hidden": {             "true": {               "#disabled": "clients.@(3,clientId)"             },             "false": {               "#enabled": "clients.@(3,clientId)"             }           }         }       }     }   } ]

Output:

讯享网{   "clients" : {     "12" : "disabled",     "35" : "enabled"   } }

//说明//
> @(3,clientId)解释:
> @取的是价值,3(画成树去看),
> “*”是“1234”或“1235”,取其子节点的clientId的值。

5、嵌套转换

//例子说明//

如果clientsActive是真实的,则执行转换 @(2,clients)的值值:true 1 clientsActive 2 { “Lucas公司”:{ “的clientId”:“LUCAS”的成员, “指数”:1 }, “thunder”:{ “的clientId”:“THUNDER”, “指数”:0 } }

Json Input:

讯享网{   "clientsActive": true,   "clients": {     "Lucas": {       "clientId": "LUCAS",       "index": 1     },     "thunder": {       "clientId": "THUNDER",       "index": 0     }   } }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "clientsActive": {         "true": {           "@(2,clients)": {             "*": {               "clientId": "clientIds[@(1,index)]"             }           }         }       }     }   } ]

Output:

讯享网{   "clientIds" : [ "THUNDER", "LUCAS" ] }

6、转义字符

Json Input:

{   "@context": {     "name": "https://blog.csdn.net/#name",     "ingredient": "https://blog.csdn.net/#ingredient",     "yield": "https://blog.csdn.net/#yield",     "step": {       "@id": "https://blog.csdn.net/",       "@type": "xgd:integer"     },     "xgd": "https://mail.xgd.com/"   } }

Jolt Spec:

讯享网[   {     "operation": "shift",     "spec": {       "\\@context": {         "name": "&1.Name",         "ingredient": "&1.Inputs",         "yield": "\\@context.Makes",         "*": "&1.&"       }     }   } ]

Output:

{   "@context" : {     "Name" : "https://blog.csdn.net/#name",     "Inputs" : "https://blog.csdn.net/#ingredient",     "Makes" : "https://blog.csdn.net/#yield",     "step" : {       "@id" : "https://blog.csdn.net/",       "@type" : "xgd:integer"     },     "xgd" : "https://mail.xgd.com/"   } }


7、利用&取关键值,替换原理,达到加后缀的目的

Json Input:

讯享网{   "Rating": 1,   "SecondaryRatings": {     "Design": 4,     "Price": 2,     "RatingDimension3": 1   } }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "Rating": "rating-primary",       "SecondaryRatings": {         "*": "rating-&"       }     }   } ]

Output:

讯享网{   "rating-primary" : 1,   "rating-Design" : 4,   "rating-Price" : 2,   "rating-RatingDimension3" : 1 }

8、利用@实现分类取值 

Json Input:

{   "enties": [     {       "type": "alpha",       "data": "foo"     },     {       "type": "beta",       "data": "bar"     },     {       "type": "alpha",       "data": "zoo"     }   ] }

Jolt Spec:

讯享网[   {     "operation": "shift",     "spec": {       "enties": {         "*": "@type[]"       }     }   } ]

Output:

{   "alpha" : [ {     "type" : "alpha",     "data" : "foo"   }, {     "type" : "alpha",     "data" : "zoo"   } ],   "beta" : [ {     "type" : "beta",     "data" : "bar"   } ] }

9、转换大小写,值类型的转换

Json Input:

讯享网{   "x": [     3,     2,     1,     "go"   ],   "small": "small",   "BIG": "BIG",   "age": "18",   "people": [     {       "firstName": "Bob",       "lastName": "Smith",       "address": {         "state": null       }     },     {       "firstName": "Sterling",       "lastName": "Archer"     }   ] }

Jolt Spec:

[   {     "operation": "modify-default-beta",     "spec": {       "y": "=join(',',@(1,x))",       "z": "=join(',',@(1,x))",       "small_toUpper": "=toUpper(@(1,small))",       "BIG_toLower": "=toLower(@(1,BIG))",       "age_toInteger": "=toInteger(@(1,age))",       "people": {         "*": {           "fullName": "=concat(@(1,firstName),'',@(1,lastName))",           "address?": {             "state": "Texas"           }         }       }     }   } ]

Output:

讯享网{   "x" : [ 3, 2, 1, "go" ],   "small" : "small",   "BIG" : "BIG",   "age" : "18",   "people" : [ {     "firstName" : "Bob",     "lastName" : "Smith",     "address" : {       "state" : "Texas"     },     "fullName" : "BobSmith"   }, {     "firstName" : "Sterling",     "lastName" : "Archer",     "fullName" : "SterlingArcher"   } ],   "y" : "3,2,1,go",   "z" : "3,2,1,go",   "small_toUpper" : "SMALL",   "BIG_toLower" : "big",   "age_toInteger" : 18 }

10、 “|”通配符

>  “|”表示“或”的逻辑,很容易理解,它只会匹配写出的字符,如:

Json Input:

{   "reserve": {     "red_packet": {       "quantity": "10",       "color": "red",       "Color": "green"     }   } }

Jolt Spec:

讯享网[   {     "operation": "shift",     "spec": {       "reserve": {         "red_packet": {           "quantity": "properties.quantity",           "color|Color": "last_color"         }       }     }   } ]

Output:

{   "properties" : {     "quantity" : "10"   },   "last_color" : [ "red", "green" ] }

11、去除一个字段:

Json Input:

讯享网{   "_id": {     "$old": ""   },   "id": 123 }

Jolt Spec:

[   {     "operation": "shift",     "spec": {       "_id": null,       "*": "&"     }   } ]

Output:

讯享网{   "id" : 123 }

12、default转换

(NOTE)注:default转换比较简单,对应的java类是Defaultr,主要作用是预先设置一些默认值,如果input中不存在该值,则使用默认值进行补齐。

Json Input:

{   "reserve": {     "number": 8,     "red_packet": {       "packet_id": "10000",       "quantity": "10"     }   } }

Jolt Spec:

讯享网[    {      "operation": "shift",      "spec": {        "reserve": {          "number": "properties.counter",          "red_packet": {            "packet_id": "properties.packet_id",            "quantity": "properties.quantity"          }        }      }       },    {      "operation": "default",      "spec": {        "type": "track",        "event": "redpacket_noregister",        "project": "coincola"      }    } ]

Output:

{   "properties" : {     "counter" : 8,     "packet_id" : "10000",     "quantity" : "10"   },   "event" : "redpacket_noregister",   "type" : "track",   "project" : "coincola" }
小讯
上一篇 2025-02-05 22:32
下一篇 2025-02-08 09:12

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/39834.html