test(jolt-demo): 添加新功能测试用例和规格说明
- 新增 cardinality、default、modify、remove、shift、sort等操作的测试用例 - 添加相应的规格说明文件,详细描述每种操作的使用方法和示例 - 为 shift 操作提供了多种不同场景的测试用例和说明
This commit is contained in:
parent
f9eb0bdea3
commit
9ace3f6737
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"review" : {
|
||||||
|
"rating" : [ 5, 4 ]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"views": [
|
||||||
|
{
|
||||||
|
"count": 1024
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"count": 2048
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "cardinality",
|
||||||
|
"spec": {
|
||||||
|
"review": {
|
||||||
|
"rating": "ONE"//取rating数组第一个元素,输出:{"review":{"rating":5}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "cardinality",
|
||||||
|
"spec": {
|
||||||
|
"views": {
|
||||||
|
"@": "ONE",
|
||||||
|
"count": "MANY"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//在cardinality场景,@用于声明当前层级的基数规则
|
||||||
|
//作为特殊键名"@"出现,值为基数规则("ONE"或"MANY"),通常位于嵌套对象内部
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"Rating": 3,
|
||||||
|
"SecondaryRatings": {
|
||||||
|
"quality": {
|
||||||
|
"Range": 7,
|
||||||
|
"Value": 3,
|
||||||
|
"Id": "quality"
|
||||||
|
},
|
||||||
|
"sharpness": {
|
||||||
|
"Value": 4,
|
||||||
|
"Id": "sharpness"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"name": "Alice",
|
||||||
|
"age": null,
|
||||||
|
"contact": {
|
||||||
|
"phone": "12345"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"photos": [
|
||||||
|
{
|
||||||
|
"id": "327704",
|
||||||
|
"url": "http://bob.com/0001/327704/photo.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "327705",
|
||||||
|
"url": "http://bob.com/0002/327704/photo.jpg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "327706"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "default",
|
||||||
|
"spec": {
|
||||||
|
"Range": 5,
|
||||||
|
"data": {
|
||||||
|
"default": 12345
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,10 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "default",
|
||||||
|
"spec": {
|
||||||
|
"age": 18, // 原始 age 是 null,会被填充为 18
|
||||||
|
"gender": "female", // 原始无 gender 字段,会被添加
|
||||||
|
"active": true // 原始无 active 字段,会被添加
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "default",
|
||||||
|
"spec": {
|
||||||
|
"photos[]": {
|
||||||
|
"2": {
|
||||||
|
"url": "http://www.bazaarvoice.com",
|
||||||
|
"caption": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"x": [
|
||||||
|
3,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
"go"
|
||||||
|
],
|
||||||
|
"small": "small",
|
||||||
|
"BIG": "BIG",
|
||||||
|
"people": [
|
||||||
|
{
|
||||||
|
"firstName": "Bob",
|
||||||
|
"lastName": "Smith",
|
||||||
|
"address": {
|
||||||
|
"state": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"firstName": "Sterling",
|
||||||
|
"lastName": "Archer"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "modify-default-beta",
|
||||||
|
"spec": {
|
||||||
|
"y": "=join(',',@(1,x))",
|
||||||
|
"z": "=join(' ',@(1,x))",
|
||||||
|
"small_toUpper": "=toUpper(@(1,small))",
|
||||||
|
"BIG_toLower": "=toLower(@(1,BIG))",
|
||||||
|
"people": {
|
||||||
|
"*": {
|
||||||
|
"fullName": "=concat(@(1,firstName),' ',@(1,lastName))",
|
||||||
|
"address?": {
|
||||||
|
"state": "Texas"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"~emVersion": "2",
|
||||||
|
"id": "123124",
|
||||||
|
"productId": "31231231",
|
||||||
|
"submissionId": "34343",
|
||||||
|
"this": "stays",
|
||||||
|
"configured": {
|
||||||
|
"a": "b",
|
||||||
|
"c": "d"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"ratings": {
|
||||||
|
"Set1": {
|
||||||
|
"a": "a",
|
||||||
|
"b": "b"
|
||||||
|
},
|
||||||
|
"Set2": {
|
||||||
|
"c": "c",
|
||||||
|
"b": "b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"ratings_legacy": {
|
||||||
|
"Set1": {
|
||||||
|
"a": "a",
|
||||||
|
"b": "b"
|
||||||
|
},
|
||||||
|
"Set2": {
|
||||||
|
"a": "a",
|
||||||
|
"b": "b"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ratings_new": {
|
||||||
|
"Set1": {
|
||||||
|
"a": "a",
|
||||||
|
"b": "b"
|
||||||
|
},
|
||||||
|
"Set2": {
|
||||||
|
"a": "a",
|
||||||
|
"b": "b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "remove",
|
||||||
|
"spec": {
|
||||||
|
"~emVersion": "",
|
||||||
|
"productId": "",
|
||||||
|
"submissionId": "",
|
||||||
|
"configured": {
|
||||||
|
"c": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,12 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "remove",
|
||||||
|
"spec": {
|
||||||
|
"ratings": {
|
||||||
|
"*": {
|
||||||
|
"b": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,10 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "remove",
|
||||||
|
"spec": {
|
||||||
|
"ratings_*": {
|
||||||
|
"Set1": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"orderId": 1212,
|
||||||
|
"orderNo": "202223434343",
|
||||||
|
"goods": {
|
||||||
|
"goodsId": 123,
|
||||||
|
"goodsName": "test_goods"
|
||||||
|
},
|
||||||
|
"orderItem": [
|
||||||
|
{
|
||||||
|
"orderItemId": 1324,
|
||||||
|
"orderItemNo": "34535345"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"foo": "1"
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"author": "Stephen Hawking",
|
||||||
|
"book": "A Brief History of Time"
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"Photos": [
|
||||||
|
"AAA.jpg",
|
||||||
|
"BBB.jpg"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"photo-1-id": "327704",
|
||||||
|
"photo-1-url": "http://bob.com/0001/327704/photo.jpg"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"foo": 3
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"foo" : "bar",
|
||||||
|
"tuna" : "marlin"
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
{
|
||||||
|
"rating": {
|
||||||
|
"quality": {
|
||||||
|
"value": 3,
|
||||||
|
"max": 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
"rating": {
|
||||||
|
"primary": {
|
||||||
|
"value": 3, // 希望此值转到输出路径 "Rating"
|
||||||
|
"max": 5 // 希望此值转到输出路径 "RatingRange"
|
||||||
|
},
|
||||||
|
"quality": { // 想要输出路径 "SecondaryRatings.quality.Id" = "quality",我们想要使用key的值
|
||||||
|
"value": 3, // 希望此值转到输出路径“SecondaryRatings.quality.value”
|
||||||
|
"max": 5 // 希望此值转到输出路径“SecondaryRatings.quality.Range”
|
||||||
|
},
|
||||||
|
"sharpness": { // 想要输出路径“SecondaryRatings.sharpty.Id”=“sharpture”
|
||||||
|
"value": 7, // 希望此值转到输出路径“SecondaryRatings.sharps.value”
|
||||||
|
"max": 10 // 希望此值转到输出路径“SecondaryRatings.sharps.Range”
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"rating" : {
|
||||||
|
"quality": {
|
||||||
|
"value": 3,
|
||||||
|
"max": 5
|
||||||
|
},
|
||||||
|
"sharpness" : {
|
||||||
|
"value" : 7,
|
||||||
|
"max" : 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"tag-Pro-a": "Awesome",
|
||||||
|
"tag-Con-b": "Bogus"
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"rating": {
|
||||||
|
"primary": {
|
||||||
|
"value": 3,
|
||||||
|
"max": 5
|
||||||
|
},
|
||||||
|
"quality": {
|
||||||
|
"value": 3,
|
||||||
|
"max": 7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"ratings": {
|
||||||
|
"primary": 5,
|
||||||
|
"quality": 4,
|
||||||
|
"design": 5
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"hidden": true
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"rating": "1"
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"orderId": "data.order_id",
|
||||||
|
"orderNo": "data.order_no",
|
||||||
|
"orderItem": {
|
||||||
|
"*": {
|
||||||
|
"orderItemId": "data.order_item.[#2].order_item_id",
|
||||||
|
"orderItemNo": "data.order_item.[#2].order_item_no"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"operation": "default",
|
||||||
|
"spec": {
|
||||||
|
"Range": 5,
|
||||||
|
"data": {
|
||||||
|
"default": 12345
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"foo": {
|
||||||
|
"$": "place.to.put.key",//$获取到key本身,输出到place.to.put.key、place.to.put.key=foo
|
||||||
|
"@": "place.to.put.value"//@获取到key对应的value,输出到place.to.put.value、place.to.put.value=1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//在LHS,@是根节点,不允许有子节点???
|
||||||
|
//在LHS中,@代表当前处理层级的根位置(不是整个输入json的root!)
|
||||||
|
//@对应的value只能为简单只,比如1、"2"、"xxxx"、不能是"foo":{"xx":"1"}
|
||||||
|
//@的设计是直接提取当前层级的完整值,而非遍历子树
|
||||||
|
//若值本身是对象(如 { "address": { ... } }),则@无法处理其内部字段,需改用其他通配符(如&或*)
|
||||||
|
|
||||||
|
//{
|
||||||
|
// "place": {
|
||||||
|
// "to": {
|
||||||
|
// "put": {
|
||||||
|
// "key": "foo",
|
||||||
|
// "value": "1"
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"@author": "@book"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
//@author取author对应的value(Stephen Hawking)作为@book=Stephen Hawking
|
||||||
|
//@book取book对应的value作为「输出的」key,A Brief History of Time=Stephen Hawking
|
|
@ -0,0 +1,12 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"Photos": {
|
||||||
|
"1": "photo-&-url"
|
||||||
|
// 指定只匹配数组下标为1的数据
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
// & 取key值
|
|
@ -0,0 +1,9 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"photo-1-id": "Photos[1].Id",//输出到Photos[1].Id、1是索引
|
||||||
|
"photo-1-url": "Photos[1].Url"//输出到Photos[1].Url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,11 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"foo": [
|
||||||
|
"bar",
|
||||||
|
"baz"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,9 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"foo": "baz",
|
||||||
|
"tuna": "baz"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"rating": {
|
||||||
|
"quality": {
|
||||||
|
"value": "SecondaryRatings.quality.Value", // 输出 SecondaryRatings.quality.Value:3
|
||||||
|
"max": "SecondaryRatings.quality.RatingRange" // 输出 SecondaryRatings.quality.RatingRange:5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//"SecondaryRatings.quality.RatingRange" 代表输出路径
|
|
@ -0,0 +1,20 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"rating": {
|
||||||
|
"primary": {
|
||||||
|
"value": "Rating",//输出Rating:3
|
||||||
|
"max": "RatingRange"//输出RatingRange:5
|
||||||
|
},
|
||||||
|
"*": {//匹配rating层级的quality、sharpness,除了primary
|
||||||
|
"value": "SecondaryRatings.&1.Value",//左边:rating.*.value :右边: SecondaryRatings.*.Value
|
||||||
|
"max": "SecondaryRatings.&1.Range",//左边:rating.*.max :右边: SecondaryRatings.*.Range
|
||||||
|
"$": "SecondaryRatings.&1.Id" //表示使用输入键本身的值作为数据、左边 rating.*.quality or sharpness :右边: SecondaryRatings.*.Id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
// * 通配符只能在LHS使用、* 代表匹配整个key字符串,user-* 代表匹配以user开头的key字符串
|
||||||
|
// &1 是回溯引用,指向上一层通配符 * 匹配到的键(如 "quality")
|
|
@ -0,0 +1,15 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"rating": {
|
||||||
|
"*": {
|
||||||
|
"max": "Rating.[#2].amx",//左边rating.*.max : 右边:Rating[{max:5}]
|
||||||
|
"value": "Rating.[#2].value"//左边rating.*.value:右边:Rating[{value:3}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
//[#2]代表生成数组
|
|
@ -0,0 +1,35 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"tag-*-*": "&(0,0)"//左边:* 是通配符,匹配所有以 tag- 开头的键、右边:& 是 Jolt 的引用操作符,用于提取匹配结果。
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//&在LHS和RHS都能使用,&是引用操作符
|
||||||
|
//(0,1) 指定引用方式:0:表示整个匹配的键,如 tag-Pro、1:表示通配符 * 捕获的部分
|
||||||
|
//&(0,1) 的含义:取匹配键中第一个通配符捕获的部分(即删除 tag- 前缀)
|
||||||
|
|
||||||
|
//在 Jolt 的 shift 操作中,& 是引用操作符,用于提取匹配模式中的特定部分。括号内的两个参数 (a,b) 分别表示:
|
||||||
|
//a(层级回溯数):指定从当前匹配位置向上回溯的层级数**(0 表示当前层级,1 表示父级,以此类推)
|
||||||
|
//b(通配符序号):指定使用第几个通配符捕获组**(从 1 开始计数)
|
||||||
|
//简记:0 是“起点定位”,1 是“目标提取”
|
||||||
|
|
||||||
|
//Jolt 通过路径层级管理数据匹配。a 参数控制回溯深度,解决嵌套结构问题:
|
||||||
|
//**&(0,1)**:当前层级 → 直接取 * 内容(如 Pro)
|
||||||
|
//**&(1,1)**:回溯一级父层级 → 若父级是数组/对象,可能取父级键名
|
||||||
|
//**&(2,1)**:回溯两级 → 更上层的键名
|
||||||
|
|
||||||
|
//&在输入路径寻找值:
|
||||||
|
//{
|
||||||
|
// "foo" : {
|
||||||
|
// "bar": {
|
||||||
|
// "baz": // &0 = baz, &1 = bar, &2 = foo
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//需要指明使用第几个匹配值,比如说"tag-*-*"匹配到"tag-Foo-Bar",那么:
|
||||||
|
// &(0,0) = "tag-Foo-Bar"
|
||||||
|
// &(0,1) = "Foo"
|
||||||
|
// &(0,2) = "Bar"
|
|
@ -0,0 +1,15 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"rating": {
|
||||||
|
"*": { // 匹配“rating”以下的所有key
|
||||||
|
"$": "ratings" // 将每个“key”输出到输出中的“rating”
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//即输出JSON的value既可以是输入JSON的value,也可以是输入JSON的key
|
||||||
|
//在匹配到每个子键时,$捕获该键的名称本身
|
||||||
|
//$本质是键名提取器
|
|
@ -0,0 +1,28 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"ratings": {
|
||||||
|
"*": {
|
||||||
|
"$": "Ratings[#2].Name",//"Ratings[#2].Name": 将当前键(例如 "primary") 作为值输出到 Ratings[#2].Name。其中 $ 表示键的名称
|
||||||
|
"@": "Ratings[#2].Value"//"Ratings[#2].Value": 将当前值(例如 5) 作为值输出到 Ratings[#2].Value。其中 @ 表示值。
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
//#2实际表示向上回溯两级,索引从 0 开始
|
||||||
|
//#number 用于引用树中的层级索引
|
||||||
|
|
||||||
|
//#2的核心作用:回溯路径层级,完成动态索引填充
|
||||||
|
//当前路径:root(0) → ratings(1) → *(2) → 当前操作(3)
|
||||||
|
//#2表示从第3级向上回溯2级,即回到第1级(ratings层级)
|
||||||
|
//回溯后,Jolt会获取该层级(如ratings)下匹配项的运行时索引值(从0开始自动生成)
|
||||||
|
//例如:输入JSON的ratings有3个子键:primary(索引0)、quality(索引1)、design(索引2)
|
||||||
|
//处理primary时,#2回溯到ratings并获取索引0;处理design时获取索引2
|
||||||
|
|
||||||
|
//在LHS RHS都可以使用,但是意义不同
|
||||||
|
//在RHS, #号只在数组中有效 比如[#2]
|
||||||
|
//在LSH中,#允许您指定硬编码字符串作为输出中的值
|
||||||
|
//在LSH中,#是根节点,不允许有子节点
|
|
@ -0,0 +1,12 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"hidden" : {
|
||||||
|
"true" : { // 如果"hidden" 值是true
|
||||||
|
"#disabled" : "clients.clientId" //将 "disabled" 值写到 "clients.clientId",标准格式是 #(disabled) #disabled会自动转成#(disabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,9 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "shift",
|
||||||
|
"spec": {
|
||||||
|
"rating|Rating" : "rating-primary" // 匹配 "rating" or "Rating" 输出到rating-primary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
//|代表或的意思
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"a": "0",
|
||||||
|
"b": "-1",
|
||||||
|
"r": "9",
|
||||||
|
"d": "2"
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"operation": "sort"
|
||||||
|
}
|
||||||
|
]
|
30
pom.xml
30
pom.xml
|
@ -78,6 +78,8 @@
|
||||||
<dingtalk-stream-sdk.version>1.3.7</dingtalk-stream-sdk.version>
|
<dingtalk-stream-sdk.version>1.3.7</dingtalk-stream-sdk.version>
|
||||||
<dingtalk-sdk.version>2.1.46</dingtalk-sdk.version>
|
<dingtalk-sdk.version>2.1.46</dingtalk-sdk.version>
|
||||||
<!-- <groovy.version>4.0.15</groovy.version>-->
|
<!-- <groovy.version>4.0.15</groovy.version>-->
|
||||||
|
<dingtalk-sdk.version>2.1.46</dingtalk-sdk.version>
|
||||||
|
<latest.jolt.version>0.1.8</latest.jolt.version>
|
||||||
</properties>
|
</properties>
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
@ -422,6 +424,33 @@
|
||||||
<artifactId>jsch</artifactId>
|
<artifactId>jsch</artifactId>
|
||||||
<version>0.1.53</version>
|
<version>0.1.53</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>com.bazaarvoice.jolt</groupId>-->
|
||||||
|
<!-- <artifactId>jolt-core</artifactId>-->
|
||||||
|
<!-- <version>0.1.7</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>com.bazaarvoice.jolt</groupId>-->
|
||||||
|
<!-- <artifactId>json-utils</artifactId>-->
|
||||||
|
<!-- <version>0.1.7</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
<!-- <dependency>-->
|
||||||
|
<!-- <groupId>com.fasterxml.jackson.core</groupId>-->
|
||||||
|
<!-- <artifactId>jackson-databind</artifactId>-->
|
||||||
|
<!-- <version>2.13.3</version>-->
|
||||||
|
<!-- </dependency>-->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bazaarvoice.jolt</groupId>
|
||||||
|
<artifactId>jolt-core</artifactId>
|
||||||
|
<version>${latest.jolt.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.bazaarvoice.jolt</groupId>
|
||||||
|
<artifactId>json-utils</artifactId>
|
||||||
|
<version>${latest.jolt.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
@ -572,7 +601,6 @@
|
||||||
<enabled>false</enabled>
|
<enabled>false</enabled>
|
||||||
</snapshots>
|
</snapshots>
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
Loading…
Reference in New Issue