目录
一、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" }

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