2025年jolt详细使用教程

jolt详细使用教程这是一个 jolt 使用教程的项目 Jolt 是用 Java 编写的 JSON 到 JSON 转换库 可以将我们输入的一个 json 转换成目标 json jolt 官网传送门 官网地址 详细使用教程可以访问本人如下开源项目 github jolt 教程 开源项目 jolt universe gitCode jolt 教程 开源项目 jolt universe gitee 码云 jot 教程

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

这是一个jolt 使用教程的项目

Jolt是用Java编写的JSON到JSON转换库,可以将我们输入的一个json,转换成目标json.
jolt官网传送门 官网地址.
详细使用教程可以访问本人如下开源项目
github jolt教程 开源项目 jolt-universe.
gitCode jolt 教程 开源项目 jolt-universe
gitee 码云 jot教程 开源项目 jolt-universe.

开源项目会持续更新,为大家带来更全、更好的jolt用法教程,如果大家有什么疑问,或者有什么需要转换json,可以在issues 中注明 input(输入),和Output(输出),
大家可以一起探讨交流。
文中如有描述错误,请及时留言指出。如有转载,请标明出处。

在线调试工具

在线调试工具 传送门地址.
你可以将json数据和jolt表达式在上面运行,由于这个在线工具是托管在 Google App Engine 上面的,国内的网络可能无法访问
image
讯享网

入门教程

快速入门

1在maven中添加 jolt的依赖

<dependency> <groupId>com.bazaarvoice.jolt</groupId> <artifactId>jolt-core</artifactId> <version>0.1.6</version> </dependency> <dependency> <groupId>com.bazaarvoice.jolt</groupId> <artifactId>json-utils</artifactId> <version>0.1.6</version> </dependency> 

讯享网

目前最新的版本为0.1.6 具体的版本号可以查看这里 jolt历史版本.

以下是具体的demo ShiftTest.java

演示demo

讯享网package com.example.demo.shift; import com.bazaarvoice.jolt.Chainr; import com.bazaarvoice.jolt.JsonUtils; import org.junit.jupiter.api.Test; import java.util.List; public class ShiftTest { 
    / * 测试demo */ @Test public void testDemo() { 
    //将json字符串转成object 对象 Object input = JsonUtils.classpathToObject("/json/sample/input.json"); //将json字符串转成List 对象 List spec = JsonUtils.classpathToList("/json/sample/spec.json"); Chainr chainr = Chainr.fromSpec(spec); //转换结果 Object transform = chainr.transform(input); System.out.println(JsonUtils.toJsonString(transform)); } } 

/json/sample/input.json

数据json文件

{ 
    "orderId": 1212, "orderNo":"3", "goods": { 
    "goodsId": 123, "goodsName": "test_goods" }, "orderItem": [{ 
    "orderItemId": 1324, "orderItemNo": "" }] } 

/json/sample/spec.json

表达式json文件

讯享网[{ 
    "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 } } } ] 

输出结果:

{ 
    "data" : { 
    "order_id" : 1212, "order_no" : "3", "order_item" : [ { 
    "order_item_id" : 1324, "order_item_no" : "" } ], "default" : 12345 }, "Range" : 5 } 

jolt的不同模式和用法

讯享网shift : 将输入json复制到输出json default : 为输出的json树中增加默认值 remove : 从json树中去除指定的key sort : 按字母顺序排序映射键值 cardinality : 修正输入数据的基数。urls元素通常是一个List,但是如果只有一个,那么它就是一个字符串 modify-overwrite-beta:总是写 modify-default-beta:当键值对应的值是null时写入 modify-define-beta:当键值不存在时写入 自定义Java类全路径名称:实现Transform或ContextualTransform接口,可选择SpecDriven接口 上面的模式是可以互相结合使用的,下文会详细讲解 以上的说明借鉴了"Panda诚博客" 博客的内容,下面有给出博主的博客地址 

上面的前5种类型都只对json的结构进行转换,如果需要对数据进行操作则需要用到modify等相关操作
这里也给大家推荐一下,同样分享jolt的博主 Panda诚博客 传送门.
下面我会给大家详细说明以上不同模式的用法和一些样例。

shift模式的详细例子

shift 模式的作用的将一个input 的json 转成 expected的json,只改变数据结构,不对数据进行操作

简单的格式转换

input 输入:

 { 
    "order": { 
    "orderItem": { 
    "id": 3, "num": 5 } } } 

expected 预期输出:

讯享网 { 
    "orderForm": { 
    "orderDetails": { 
    "id": 3, "num": 5 } } } 

jolt简单的表达式如下:

[ { 
    "operation": "shift", "spec": { 
    "order": { 
    "orderItem": { 
    "id": "orderForm.orderDetails.id", // 将id 为3的值复制到 "orderForm.orderDetails.id"的路径上 "num": "orderForm.orderDetails.num" // 将num为 5的值复制到"orderForm.orderDetails.num" } } } } ] 
shift模式中‘&’和‘*'的简单使用
讯享网{ 
    "rating": { 
    "primary": { 
    "value": 3 }, "quality": { 
    "value": 3 } } } 

expected 预期输出:

{ 
    "SecondaryRatings" : { 
    "data_primary" : { 
    "val" : 3 }, "data_quality" : { 
    "val" : 3 } } } 

jolt 表达式如下:

讯享网[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "*": { 
    //这里的‘*’匹配的是 input 中的 primary 和 quality "value": "SecondaryRatings.data_&1.val" // &1匹配的就是 primary 或 quality } } } } ] 

下面我们再用更多具体的例子,让大家更深入了解“&”的用法
下面为大家讲解如何利用将input 一个值赋值给两个key
input 输入:

{ 
    "rating_primary_value": 3 } 

expected 预期输出:

讯享网{ 
    "key_primary" : 3, "key_value" : 3 } 

jolt 表达式,这里给大家演示两种方式

//方式1: [ { "operation": "shift", "spec": { //这里数组的意思是将 rating_primary_value 的值拷贝到数组元素的key中 "rating_primary_value": ["key_primary", "key_value"] } } ] //方式2: [ { "operation": "shift", "spec": { // 第一个“*”号匹配的是"primary",第二的“*”匹配的是"value" //&(0,1)指的是第一个“*”号匹配的值,&(0,2)指的是第二个星号匹配的值 "rating_*_*": ["key_&(0,1)", "key_&(0,2)"] } } ] //上面这个例子 &0 和&(0,0)的效果是等价的匹配到的都是 “rating_primary_value” ,&(0,1)指的就是在 "rating_*_*" 中一个*号匹配的值"primary", 以此类推 // &1 和 &(1,0)匹配到的是 “root”,这个后面我们的源码中会讲解 
shift模式中数组的转换和 ‘#’的使用
讯享网{ 
    "orderId": 1212, "orderNo": "3", "orderItem": [ { 
    "orderItemId": 1, "orderItemNo": "2022xxxxxx01", "goods": [ { 
    "goodsId": 1, "goodsNum": 5 }, { 
    "goodsId": 2, "goodsNum": 6 } ] }, { 
    "orderItemId": 2, "orderItemNo": "2022xxxxxx02", "goods": [ { 
    "goodsId": 3, "goodsNum": 6 }, { 
    "goodsId": 4, "goodsNum": 7 } ] } ] } 

shift :

[{ 
    "operation": "shift", "spec": { 
    "orderId": "o_id", "orderNo": "o_no", "orderItem": { 
    "*": { 
    // '*' 匹配的是orderItem数组的下标 "orderItemId": "o_item.[#2].o_item_id", // #2代表的是从orderItemId往上数的第二个key,也就是'orderItem',这就代表着 o_item数组对标 输入的 orderItem "orderItemNo": "o_item.[#2].o_item_no", "goods": { 
    "*": { 
    "goodsId": "o_item.[#4].o_goods.[#2].g_id", // 这里类似 [#4] 往上数4就是'orderItem',[#2]就是 'goods' "goodsNum": "o_item.[#4].o_goods.[#2].g_num" } } } } } }] 

输出:

讯享网{ 
    "o_id": 1212, "o_no": "3", "o_item": [ { 
    "o_item_id": 1, "o_item_no": "2022xxxxxx01", "o_goods": [ { 
    "g_id": 1, "g_num": 5 }, { 
    "g_id": 2, "g_num": 6 } ] }, { 
    "o_item_id": 2, "o_item_no": "2022xxxxxx02", "o_goods": [ { 
    "g_id": 3, "g_num": 6 }, { 
    "g_id": 4, "g_num": 7 } ] } ] } 
[ { 
    "orderItemId": 1, "orderItemNo": "2022xxxxxx01" }, { 
    "orderItemId": 2, "orderItemNo": "2022xxxxxx02" } ] 

预期输出:

讯享网[ { 
    "orderId" : 1, "orderNo" : "2022xxxxxx01" }, { 
    "orderId" : 2, "orderNo" : "2022xxxxxx02" } ] 

spec 表达式:

[ { 
    "operation": "shift", "spec": { 
    "*": { 
    "orderItemId": "[#2].orderId", "orderItemNo": "[#2].orderNo" } } } ] 
讯享网[ { 
    "operation": "shift", "spec": { 
    "*": { 
    "orderItemId": "[&1].orderId", "orderItemNo": "[&1].orderNo" } } } ] 

shift 模式也支持取出指定下标的元素

{ 
    "order": [ { 
    "orderItemId": 1, "orderItemNo": "2022xxxxxx01" }, { 
    "orderItemId": 2, "orderItemNo": "2022xxxxxx02" } ] } 

取出下标为0的元素 spec:

讯享网[ { 
    "operation": "shift", "spec": { 
    "order": { 
    "0": "order" } } } ] 

输出结果:

{ 
    "order" : { 
    "orderItemId" : 1, "orderItemNo" : "2022xxxxxx01" } } 

‘&’转换数组和‘#’的区别在于[]里面的数值,‘&’ 比‘#’小1,
[&]对应的是下标,如上文 * 匹配的是下标 0或 1,[&1]只的就是对应的下标0或1
[#]要对应的是上层的key,如上文,[#2]对应的是key ‘root’,有小伙伴就会产生疑问这个‘root’是哪来的,input里面没有呀,别着急后续我们会在源码篇详细讲解

上面将的都是‘#’在LHS的用,下面我们将一下‘#’在 RHS变的用法,‘#’在RHS可以给输出key赋值指定字符串

讯享网{ 
    "rating": "555", "primary": "1234" } 

spec:

[ { 
    "operation": "shift", "spec": { 
    "rating": "rating", "primary": "primary", "#666": "value" //给value 赋值 “666” } } ] 

输出结果:

讯享网{ 
    "value" : "666", "rating" : "555", "primary" : "1234" } 
package com.example.oxy.enums; import lombok.Getter; / * 性别枚举类 * @author oxy */ public enum SexEnum { 
    MAN("男", "man"), WOMAN("女", "woman"); @Getter private String desc; @Getter private String code; SexEnum(String desc, String code) { 
    this.desc = desc; this.code = code; } } 

input 输入:

讯享网{ 
    "name": "张三", "sex": 1 } 

shift:

[ { 
    "operation": "shift", "spec": { 
    "name": "name", "sex": { 
    "1": { 
    //如果sex =1 ,将其转成男性枚举值 "#男": "sex.desc", "#man": "sex.code" }, "2": { 
    //如果sex =2 ,将其转成女性枚举值 "#女": "sex.desc", "#woman": "sex.code" } } } } ] 
讯享网{ 
    "name" : "张三", "sex" : { 
    "desc" : "男", "code" : "man" } } 
shift模式中 ‘$’的使用
{ 
    "rating": { 
    "primary": { 
    "value": 3 }, "quality": { 
    "value": 3 } } } 

spec:

讯享网[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "primary": { 
    "value": "Rating", "max": "RatingRange" }, "*": { 
    //"*"匹配的是 quality "$": "SecondaryRatings.Id" //"$"的意思是将“*”匹配的key 当做值赋值给 SecondaryRatings.Id } } } } ] 

输出:

{ 
    "Rating" : 3, "SecondaryRatings" : { 
    "Id" : "quality" } } 
shift模式中 ‘@’的使用
讯享网{ 
    "rating": { 
    "primary": 111, "quality": 222 }, "xxx": 4444 } 

spec:

[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "@": "yyy" //将@等价于@0,代表的是将 rating 的值赋值给yyy } } } ] 

输出:

讯享网{ 
    "yyy" : { 
    "primary" : 111, "quality" : 222 } } 

input 输入:

{ 
    "rating": { 
    "primary": 111, "quality": 222 }, "xxx": 4444 } 

spec:

讯享网[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "@primary": "yyy", //将@primary等价于@(0,primary),代表的是将 primary 的值赋值给yyy "@quality": "aaa", //将@primary等价于@(0,quality),代表的是将 quality 的值赋值给aaa "@(1,xxx)": "bbb", //@(1,xxx) 的1代表和rating同一个等级的xxx 的值赋值给 bbb "primary": { 
    "@(2,xxx)": "ccc" //@(2,xxx)的2是'primary'指往上数2个等级的也就是和rating同一等级的xxx的值赋值给ccc } } } } ] 

输出:

{ 
    "yyy" : 111, "aaa" : 222, "bbb" : 4444, "ccc" : 4444 } 

'@'在RHS的使用例子

input 输入:

讯享网{ 
    "rating": { 
    "primary": "orderKey", "quality": "order" } } 

spec:

[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "@primary": "@quality" //将rating.primary的值赋值给 order,order是rating.quality的值 } } } ] 

输出:

讯享网{ 
    "order" : "orderKey" } 

default 模式的详细例子

default 的作用是给json赋默认值,如果对应的key不存在或值为null时,给其赋上默认值

简单的赋默认值

input 输入:

{ 
    "rating": { 
    "primary": { 
    "value": 3 }, "quality": { 
    "value": 3 } } } 

expected 预期输出:

讯享网{ 
    "rating" : { 
    "primary" : { 
    "value" : 3, "Range" : 5 }, "quality" : { 
    "value" : 3, "Range" : 5 } }, "Range" : 5 } 

jolt简单的表达式如下:

[ { 
    "operation": "default", "spec": { 
    "Range": 5, "rating": { 
    "*": { 
   //这是的星号匹配的是key "primary" 和 "quality" // 给rating.primary.Range、rating.quality.Range赋默认值5 "Range": 5 } } } } ] 

default 默认是只能给不存在的key或key 为null的字段 赋默认值,如果对应的key已存在具体值default的配置则不会起效果

讯享网例子: input 输入: { "default": null } jolt 表达式: [ { "operation": "default", "spec": { "Range": 5, "default": 6 } } ] expected输出结果: { "default" : 6, "Range" : 5 } input 如果输入的结果是: { "default": 3 } expected输出结果: { "default" : 3, "Range" : 5 } 

remove 模式的详细例子

remove 的作用是将json中不需要的key进行删除

简单的remove例子

input 输入:

{ 
    "rating": { 
    "primary": { 
    "value": 3, "id": 23 }, "quality": { 
    "value": 3, "id": 24 } } } 

spec :

讯享网[ { 
    "operation": "remove", "spec": { 
    "rating": { 
    "primary": "", //删除 rating.primary "quality": { 
    "id": "" //删除 rating.quality.id } } } } ] 

expected 输出:

{ 
    "rating" : { 
    "quality" : { 
    "value" : 3 } } } 

cardinality 模式的详细例子

简单的cardinality例子

cardinality模式的作用是可以将单个数据包装成数组,或者取出数组中第一个元素
‘ONE’:如果输入值是一个列表,则获取该列表中的第一个元素,并将其设置为该元素的数据,不支持其他类型
‘MANY’:如果输入不是列表,则创建一个列表并将第一个元素设置为输入值。如果输入是"null",使它成为一个空列表。如果输入是一个列表,不支持。

input 输入:

讯享网{ 
    "rating": { 
    "primary": [ { 
    "value": 3, "id": 23 }, { 
    "value": 3, "id": 23 } ], "quality": { 
    "value": 5, "id": 25 } } } 

spec :

[ { 
    "operation": "cardinality", "spec": { 
    "rating": { 
    "primary": "ONE", //取出 primary 中的一个元素 "quality": "MANY" //将 quality 转换成数组 } } } ] 

expected 输出:

讯享网{ 
    "rating": { 
    "primary": { 
    "value": 3, "id": 23 }, "quality": [ { 
    "value": 5, "id": 25 } ] } } 

modify 模式的详细例子

modify相关案例讲解

modify又分成如下模式:
modify-overwrite-beta: 模式是对指定的key的数据进行操作,无法key是否存在或已存在值,始终会对其进行操作
default modify-default-beta :当键值对应的值是null时写入
define modify-define-beta :当键值不存在时写入
modify 模式包含如下函数:

 private static final Map<String, Function> STOCK_FUNCTIONS = new HashMap<>( ); static { STOCK_FUNCTIONS.put( "toLower", new Strings.toLowerCase() ); STOCK_FUNCTIONS.put( "toUpper", new Strings.toUpperCase() ); STOCK_FUNCTIONS.put( "concat", new Strings.concat() ); STOCK_FUNCTIONS.put( "join", new Strings.join() ); STOCK_FUNCTIONS.put( "split", new Strings.split() ); STOCK_FUNCTIONS.put( "substring", new Strings.substring() ); STOCK_FUNCTIONS.put( "trim", new Strings.trim() ); STOCK_FUNCTIONS.put( "leftPad", new Strings.leftPad() ); STOCK_FUNCTIONS.put( "rightPad", new Strings.rightPad() ); STOCK_FUNCTIONS.put( "min", new Math.min() ); STOCK_FUNCTIONS.put( "max", new Math.max() ); STOCK_FUNCTIONS.put( "abs", new Math.abs() ); STOCK_FUNCTIONS.put( "avg", new Math.avg() ); STOCK_FUNCTIONS.put( "intSum", new Math.intSum() ); STOCK_FUNCTIONS.put( "doubleSum", new Math.doubleSum() ); STOCK_FUNCTIONS.put( "longSum", new Math.longSum() ); STOCK_FUNCTIONS.put( "intSubtract", new Math.intSubtract() ); STOCK_FUNCTIONS.put( "doubleSubtract", new Math.doubleSubtract() ); STOCK_FUNCTIONS.put( "longSubtract", new Math.longSubtract() ); STOCK_FUNCTIONS.put( "divide", new Math.divide() ); STOCK_FUNCTIONS.put( "divideAndRound", new Math.divideAndRound() ); STOCK_FUNCTIONS.put( "toInteger", new Objects.toInteger() ); STOCK_FUNCTIONS.put( "toDouble", new Objects.toDouble() ); STOCK_FUNCTIONS.put( "toLong", new Objects.toLong() ); STOCK_FUNCTIONS.put( "toBoolean", new Objects.toBoolean() ); STOCK_FUNCTIONS.put( "toString", new Objects.toString() ); STOCK_FUNCTIONS.put( "size", new Objects.size() ); STOCK_FUNCTIONS.put( "toJsonString", new Objects.toJsonString() ); STOCK_FUNCTIONS.put( "squashNulls", new Objects.squashNulls() ); STOCK_FUNCTIONS.put( "recursivelySquashNulls", new Objects.recursivelySquashNulls() ); STOCK_FUNCTIONS.put( "squashDuplicates", new Objects.squashDuplicates() ); STOCK_FUNCTIONS.put( "noop", Function.noop ); STOCK_FUNCTIONS.put( "isPresent", Function.isPresent ); STOCK_FUNCTIONS.put( "notNull", Function.notNull ); STOCK_FUNCTIONS.put( "isNull", Function.isNull ); STOCK_FUNCTIONS.put( "firstElement", new Lists.firstElement() ); STOCK_FUNCTIONS.put( "lastElement", new Lists.lastElement() ); STOCK_FUNCTIONS.put( "elementAt", new Lists.elementAt() ); STOCK_FUNCTIONS.put( "toList", new Lists.toList() ); STOCK_FUNCTIONS.put( "sort", new Lists.sort() ); } 

其对应函数的功能和java同名函数一样
toLower :将字符转成小写
toUpper : 将字符转成大写
concat :合并字符串
下面就不一一说明了,详情说明可以访问开源项目查看

modify-overwrite-beta相关案例讲解

字符串相关处理

input 输入:

讯享网{ 
    "rating": { 
    "primary": { 
    "value": 3, "value1": "ABC", "value2": "dnf" }, "quality": { 
    "value": 3 } } } 

spec :

[ { 
    "operation": "modify-overwrite-beta", "spec": { 
    "rating": { 
    "primary": { 
    "value": "=toString", //将 value转成字符串 "value1": "=toLower", //将value1的字符变成小写 "value2": "=toUpper", //将value2的字符变成大写 "value3": "=concat(a,b,c,d,e,c,g)", //将括号里的数值拼成字符串 "value4": "=join('_',5,4,5,6,7,8,9,90,0)", // 以‘—’将后面的元素连接在一起 "value5": "=split('_','order_item_info')", //以‘_’分割字符串 "value6": "=substring('abcdefg',3,3)", //截取‘abcdefg’的子串 "value7": "=trim", // 去除 ‘ yy ’ 前后空格 "value8": "=leftPad('abc',5,c)", // 5 - 'abc'.length()等于2,所在在左边增加两个c "value9": "=rightPad('abc',5,d)" // 5 - 'abc'.length()等于2,所在在右边增加两个d }, "quality": { 
    "value1": "=min(1,3,4,6)", // 从 1,3,4,6中选最小值赋值给value1 "value2": "=max(1,3,4,6)" // 从 1,3,4,6中选最大值赋值给value2 } } } } ] 

expected 输出:

讯享网{ 
    "rating" : { 
    "primary" : { 
    "value" : "3", "value1" : "abc", "value2" : "DNF", "value7" : "yy", "value3" : "abcdecg", "value4" : "5_4_5_6_7_8_9_90_0", "value5" : [ "order", "item", "info" ], "value8" : "ccabc", "value9" : "abcdd" }, "quality" : { 
    "value" : 3, "value1" : 1, "value2" : 6 } } } 
数学运算

input 输入:

{ 
    "rating": { 
    "primary": { 
    "value": 3 }, "quality": { 
    "value": 3 } } } 

spec :

讯享网[ { 
    "operation": "modify-overwrite-beta", "spec": { 
    "rating": { 
    "quality": { 
    "value1": "=min(1,3,4,6)", // 从 1,3,4,6中选最小值赋值给value1 "value2": "=max(1,3,4,6)", // 从 1,3,4,6中选最大值赋值给value2 "value3": "=abs(-100)", //取一个数据的绝对值 "value4": "=avg(1,2,3)", // 取 1,2,3 的平均值 "value5": "=intSum(1,2,3)", // int求和 "value6": "=doubleSum(1.0,2.0,3.0)", // double求和 "value7": "=longSum(10000,20000,30000)", //long求和 "value8": "=intSubtract(6,2)", //整数减法 6-2 "value9": "=doubleSubtract(6.0,2.2)", //浮点数减法6.0 - 2.2 "value10": "=divide(10,2)", //除法 10/2 "value11": "=divideAndRound(2,30,7)" //除法 30/7四舍五入,第一个2参数指的是保留几位小数 } } } } ] 

expected 输出:

{ 
    "rating" : { 
    "primary" : { 
    "value" : 3 }, "quality" : { 
    "value" : 3, "value1" : 1, "value2" : 6, "value3" : 100, "value4" : 2.0, "value5" : 6, "value6" : 6.0, "value7" : 60000, "value8" : 4, "value9" : 3.8, "value10" : 5.0, "value11" : 4.29 } } } 
类型转换

input 输入:

讯享网{ 
    "rating": { 
    "primary": { 
    "value1": "3", "value2": 2, "value3": "33", "value4": "false", "value5": 1999, "value6": "" } } } 

spec :

[ { 
    "operation": "modify-overwrite-beta", "spec": { 
    "rating": { 
    "primary": { 
    "value1": "=toInteger", // 转换成int类型 "value2": "=toDouble", // 转换成Double类型 "value3": "=toLong", //转换成long类型 "value4": "=toBoolean", //转换成Boolean类型 "value5": "=toString", // 转换成String类型 "value6": "=size", // 求字符串长度 "value7": "=size(1,2,3,4,5,6,7,8)" //求数组元素个数 } } } } ] 

expected 输出:

讯享网{ 
    "rating" : { 
    "primary" : { 
    "value1" : 3, "value2" : 2.0, "value3" : 33, "value4" : false, "value5" : "1999", "value6" : 9, "value7" : 8 } } } 
数组的操作

input 输入:

{ 
    "rating": { 
    "primary": { 
    "value0":[6,5,4,3,2,1], "value1": [ "a", null, 1, null, "b" ], "value2": [ "a", null, { 
    "x": "X", "y": null, "zList" : [ "z1", null, "z3" ] }, null, "b" ], "value3": [ "abc", "abc", "xyz", "cde", "bcd" ], "value4": [ "abc", "abc", "xyz", "cde", "bcd" ], "value5": [ "abc", "abc", "xyz", "cde", "bcd" ], "value6": [ "abc", "abc", "xyz", "cde", "bcd" ] } } } 

spec :

讯享网[ { 
    "operation": "modify-overwrite-beta", "spec": { 
    "rating": { 
    "primary": { 
    "value1": "=squashNulls", // 去除空值 "value2": "=recursivelySquashNulls", // 递归去除空值 "value3": "=squashDuplicates", //去除重复值 "value4": "=firstElement", //取数组第一个值 "value5": "=lastElement", // 取数组最后一个值 "value6": "=elementAt(2,@(1,value0))", // 取value0数组下标为2的值 "value7": "=toList(10)", //将元素转换数组 "value8": "=sort(@(1,value0))" //将value0升序排序 } } } } ] 

expected 输出:

{ 
    "rating" : { 
    "primary" : { 
    "value0" : [ 6, 5, 4, 3, 2, 1 ], "value1" : [ "a", 1, "b" ], "value2" : [ "a", { 
   "x" : "X","zList" : [ "z1", "z3" ] }, "b" ], "value3" : [ "abc", "xyz", "cde", "bcd" ], "value4" : "abc", "value5" : "bcd", "value6" : 4, "value7" : [ 10 ], "value8" : [ 1, 2, 3, 4, 5, 6 ] } } } 

不同模式结合使用的案例

不同模式结合使用的相关案例讲解

jolt的表达式是一个列表,所以我们在使用的时候可以结合多种模式一起使用

input 输入:

讯享网{ 
    "rating": { 
    "primary": { 
    "value": 3 }, "quality": { 
    "value": 3 } } } 

spec:

[ { 
    "operation": "shift", "spec": { 
    "rating": { 
    "primary": { 
    // simple match. Put the value '4' in the output under the "Rating" field "value": "Rating", "max": "RatingRange" }, // match any children of "rating" // Shiftr has a precendence order when matching, so the "*" will match "last". // In this case anything that isn't "primary". "*": { 
    // &1 means, go up one level and grab that value and substitute it in // in this example &1 = "quality" "max": "SecondaryRatings.&1.Range", "value": "SecondaryRatings.&1.Value", // // We want "quality" to be a value field in the output under // "SecondaryRatings.quality.Id", but "quality" is an input key not an input value. // The "$" operator means use the input key, instead of the input value as ouput "$": "SecondaryRatings.&1.Id" } } } }, { 
    "operation": "default", "spec": { 
    "Range": 5, "SecondaryRatings": { 
    "*": { 
    // Defaut all "SecondaryRatings" to have a Range of 5 "Range": 5 } } } } ] 

expected 输出:

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

需要查看更多详细的例子可以访问开源项目查看
github jolt教程 开源项目 jolt-universe.
gitCode jolt 教程 开源项目 jolt-universe.
gitee 码云 jot教程 开源项目 jolt-universe.

小讯
上一篇 2025-02-22 17:02
下一篇 2025-03-23 16:42

相关推荐

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