⚡️Jolt -- 通过JSON配置来处理复杂数据转换的工具
简介:一个能够通过JSON配置(特定的语法)来处理复杂数据转换的工具。
比如将API响应转换为内部系统所需的格式,或者处理来自不同来源的数据结构差异。例如,将嵌套的JSON结构扁平化,或者重命名字段,合并多个字段等。
名称含义:
-
JSON + Bolt:
JSON 是工具处理的数据格式。
Bolt(闪电)象征快速和高效,暗示 Jolt 能够像闪电一样快速完成 JSON 数据的转换。
Bolt的logo就是一个闪电⚡️标志 -
在社区中,Jolt 的名称被解读为 JSON Transformation Language 的缩写,强调其作为 JSON 转换语言的定位。
-
项目地址:https://github.com/bazaarvoice/jolt
-
在线验证工具:https://jolt-demo.appspot.com/#inception
使用
1. 引入maven依赖
- pom.xml
<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>
2. 编写Jolt转换规范(json格式)
- spec.json
[{"operation": "shift","spec": {"id": "id","orderType": "type","orderProductList": {"*": {"sampleNumber": "orderProductList[&1].number","id": "orderProductList[&1].id"}},"createTime": "createTime"}},{"operation": "modify-overwrite-beta","spec": {"id": "=toString(@(1,id))","createTime": "=concat(@(1,createTime), ' 00:00:00')"}}
]
3. Java集成示例
- DataTransformTool
import com.bazaarvoice.jolt.Chainr;
import com.bazaarvoice.jolt.JsonUtils;import java.util.List;/*** description: DataTransformTool <br>* date: 2025/3/13 11:47 <br>* author: Boo <br>* version: 1.0 <br>*/
public class DataTransformTool {public static String transform(String inputJson, String specPath) {List chainrSpecJSON = JsonUtils.classpathToList( specPath );Chainr chainr = Chainr.fromSpec( chainrSpecJSON );Object transformedOutput = chainr.transform( JsonUtils.jsonToObject(inputJson) );return JsonUtils.toJsonString( transformedOutput );}}
- Test.java
public static main(String[] args) {String inputJson = "{" +" \"id\": 123456789," +" \"orderType\": \"orderTypecsss\"," +" \"orderProductList\": [" +" {\"sampleNumber\": \"number001\", \"id\": 2}," +" {\"sampleNumber\": \"SKU456\", \"id\": 1}" +" ]," +" \"createTime\": \"2025-03-13\"" +" }";System.out.println(DataTransformTool.transform(inputJson, "spec.json"));}
- 运行结果
{"id": "123456789","type": "orderTypecsss","orderProductList": [{"number": "number001","id": 2},{"number": "SKU456","id": 1}],"createTime": "2025-03-13 00:00:00"
}
Jolt 转换规范的核心语法
AI整理,仔细辨别
核心操作类型
| 操作类型 | 用途 | 示例 |
|---|---|---|
| shift | 字段映射/结构调整 | “oldField”: “newField” |
| modify-overwrite-beta | 数据修改(类型转换/计算) | “field”: “=toUpper” |
| default | 设置默认值 | “field”: “defaultVal” |
| remove | 删除字段 | “fieldToRemove”: “” |
| sort | 字段排序 | 无参数,直接使用 |
核心操作符及示例
1. shift
用途:字段重映射、结构调整。
语法:将输入路径映射到输出路径。
示例:
{"operation": "shift","spec": {"inputField": "output.parent.child", // 简单映射"nested.input.value": "output.value", // 嵌套映射"array[*].id": "output.ids[]" // 数组展开}
}
2. default
用途:设置默认值(字段不存在时生效)。
语法:
{"operation": "default","spec": {"output.role": "guest", // 单值默认"output.tags": ["default"] // 数组默认}
}
3. remove
用途:删除指定字段。
语法:
{"operation": "remove","spec": {"unusedField": "", // 删除字段"nested.tempData": "" // 删除嵌套字段}
}
4. sort
用途:按字母序排序对象键。
语法:
{ "operation": "sort" }
5. cardinality
用途:强制字段为单值或数组。
语法:
{"operation": "cardinality","spec": {"output.roles": "array", // 强制为数组"output.name": "single" // 强制为单值}
}
6. modify-overwrite-beta
用途:覆盖或修改字段值(需 Jolt 扩展库)。
语法:
{"operation": "modify-overwrite-beta","spec": {"output.score": "=toDouble(@(1,input.score))" // 转换为浮点数}
}
7. modify-default-beta
用途:条件默认值(类似 default 但支持表达式)。
语法:
{"operation": "modify-default-beta","spec": {"output.status": "=if (isPresent(@(1,input.status))) then @(1,input.status) else 'pending'"}
}
路径语法规则
点号.:表示嵌套字段,如 user.address.city。
通配符*:匹配任意字段或数组元素:
users[].name:提取所有 users 元素的 name。
data..value:匹配 data 下的所有子字段的 value。
数组索引[n]:定位数组的特定位置,如 items[0].id。
转义\:若字段名包含 . 或 *,需转义,如 field\.with\.dots。
链式操作示例
json
[// 第一步:字段映射{"operation": "shift","spec": {"firstName": "user.name","age": "user.details.age"}},// 第二步:添加默认值{"operation": "default","spec": {"user.role": "guest","user.details.active": true}},// 第三步:删除冗余字段{"operation": "remove","spec": {"user.details.age": ""}}
]
输入:
{ "firstName": "John", "age": 30 }
输出:
{"user": {"name": "John","role": "guest","details": {"active": true}}
}
高级技巧
- 动态键名:使用 & 引用输入字段的值作为键:
{"operation": "shift","spec": {"userType": "output.&" // 将 userType 的值作为键}
}
输入 { “userType”: “admin” } → 输出 { “output”: { “admin”: “admin” } }。
- 条件逻辑:通过 modify 系列操作符实现复杂条件:
{"operation": "modify-overwrite-beta","spec": {"output.discount": "=if (@(1,price) > 100) then 0.1 else 0"}
}
- 数组聚合:将多个字段合并为数组:
{"operation": "shift","spec": {"tags": "output.tags[]"}
}
注意事项
- 大小写敏感:字段名和路径严格区分大小写。
- 路径不存在:若输入路径不存在,操作符会静默忽略。
- 性能优化:复杂嵌套或通配符可能影响性能,尽量简化规则。
相关文章:
⚡️Jolt -- 通过JSON配置来处理复杂数据转换的工具
简介:一个能够通过JSON配置(特定的语法)来处理复杂数据转换的工具。 比如将API响应转换为内部系统所需的格式,或者处理来自不同来源的数据结构差异。例如,将嵌套的JSON结构扁平化,或者重命名字段࿰…...
Django系列教程(7)——路由配置URLConf
目录 URLconf是如何工作的? path和re_path方法 更多URL配置示例 URL的命名及reverse()方法 使用命名URL 硬编码URL - 不建议 URL指向基于类的视图(View) 通过URL传递额外的参数 小结 Django的项目文件夹和每个应用(app)目录下都有urls.py文件,它们构成了D…...
TDengine SQL 函数
单行函数 数学函数 ABSACOSASINATANCEILCOSDEGREESEXPFLOORGREATESTLEASTLNLOGMODPIPOWRADIANSRANDROUNDSIGNSINSQRTTANTRUNCATE 字符串函数 ASCIICHARCHAR_LENGTHCONCATCONCAT_WSLENGTHLOWERLTRIMPOSITIONREPEATREPLACERTRIMSUBSTRING/SUBSTRSUBSTRING_INDEXTRIMUPPER 转换函数…...
二维数组基础
在 C 语言中,二维数组是一种数据结构,它可以存储表格形式的数据,或是矩阵形式的数据。二维数组可以被看作是一个包含多个一维数组的数组,因此它有两个维度:行和列。 1. 二维数组的定义与声明 在 C 语言中,二维数组的定义形式如下: data_type array_name[rows][column…...
2024年第十五届蓝桥杯软件C/C++大学A组——五子棋对弈
蓝桥杯原题: 题目描述: “在五子棋的对弈中,友谊的小船说翻就翻? ” 不!对小蓝和小桥来说,五子棋不仅是棋盘上的较量,更是心与心之间的沟通。这两位挚友秉承着 “ 友谊第一,比赛第二…...
复试难度解析,西电先进材料与纳米科技学院学院考研录取情况
01、先进材料与纳米科技学院各个方向 02、24先进材料与纳米科技学院近三年复试分数线对比 PS:材料院24年院线学硕方向降低10分,专硕上涨15分;材料院在分数线相对于其他211、985院校对比来看,依然分数偏低,推荐大家关注…...
Deepseek Chatgpt Kimi 推荐的深度学习书单
朋友让推荐一些深度学习的书,让 Deepseek、Chatgpt、Kimi 分别生成了一份书单并做了对比,记录一下以备以后用到。 Chatgpt 推荐的深度学习书 1. chatgpt 推荐的书目截图 1.2 Chatgpt 推荐的深度学习书目文字版 如果你想学习 Deep Learning࿰…...
高频面试题(含笔试高频算法整理)基本总结回顾25
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言,…...
ClickHouse SQL优化:解锁高性能数据分析的关键
一、引言 1.1 ClickHouse的背景与优势 ClickHouse是一款高性能的列式数据库,专为在线分析处理(OLAP)场景设计。它以其卓越的读写性能、强大的数据压缩能力和灵活的SQL支持而闻名。ClickHouse能够轻松处理PB级数据,并在亚秒级内返回查询结果,这使其成为大数据分析领域的理…...
我与DeepSeek读《大型网站技术架构》(14)- 架构师领导艺术
文章目录 架构师领导艺术以人为本:激发团队潜能开放式协作:打破架构“所有权”壁垒妥协的艺术:聚焦核心目标成就他人:构建持续进化团队高效沟通:建立技术与人性的平衡 架构师领导艺术 本章聚焦架构师如何通过团队协作…...
mac安装mysql之后报错zsh: command not found: mysql !
在Mac上安装MySQL后,如果终端中找不到mysql命令,通常是 因为MySQL的命令行工具(如mysql客户端)没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...
蓝桥杯备考:set容器用法(lower_bound)---营业额统计
如图所示,这道题的暴力解法就是枚举每天的营业额,让该营业额和前面的天的营业额依次相减取最小值这样的话我们的时间复杂度就是N平方,我们是很有可能超时的 所以我们选择用set容器的二分查找功能 我们每次遍历到一个数的时候,前…...
VSCode集成C语言开发环境
下载MinGW https://sourceforge.net/projects/mingw/ 点击download按钮下载exe文件到本地 点击exe文件安装 选择基础包和c编译版 vscode安装部分跳过 安装code runner和c/c插件 **(1) 创建 C 文件** 新建一个测试文件(例如 hello.c)…...
Python----数据可视化(pyecharts二:绘图一:条形图,直方图,折线图,散点图,箱图,饼图,热力图)
1、条形图 from pyecharts.charts import Bar from pyecharts.faker import Faker from pyecharts import options as opts # 绘制柱状图 bar (Bar() # 创建柱状图.add_yaxis("商家A", Faker.values(),colorFaker.rand_color()) # 添加数据.add_yaxis("商家B&…...
Training-free Neural Architecture Search for RNNs and Transformers(预览版本)
摘要 神经架构搜索 (NAS) 允许自动创建新的有效神经网络架构,为手动设计复杂架构的繁琐过程提供了替代方案。然而,传统的 NAS 算法速度慢,需要大量的计算能力。最近的研究调查了图像分类架构的无训练 NAS 指标,大大加快了搜索算…...
Linux机器之间排查网络连通问题
网络连通性排查步骤(基于五层模型) 以下按照网络五层架构,从底层到高层逐层排查,并分别列出Ubuntu和CentOS对应的命令。 1. 物理层 排查点:网线、网卡状态、物理连接。 命令(通用):…...
计算机考研C语言
C语言程序设计从入门到精通【2025完整版】考研复试 嵌入式 计算机二级 软考 专升本也适用_哔哩哔哩_bilibili 1、第一个C程序 helloC #include <stdio.h>int main(){printf("hehe");return 0;}每个C语言程序不管有多少行代码,都是从main函数开始执…...
【MySQL】(4) 表的操作
一、创建表 语法: 示例: 生成的数据目录下的文件: 二、查看表结构 三、修改表 语法: 另一种改表名语法:rename table old_name1 to new_name1, old_name2 to new_name2; 示例: 四、删除表 语法…...
Qt 中实现自定义控件子类化
一、子类化关键步骤 1、选择基类 根据需求选择合适的 Qt 原生控件作为基类(如 QWidget、QPushButton、QSpinBox 等),通过继承实现功能扩展。 2、重写关键方法 绘制逻辑:重写 paintEvent() 方法,使用 Q…...
[洛谷]P1123 取数游戏
最近准备蓝桥杯 一直在练搜索和图论hhh 题意 给定 n m n \times m nm的数字矩阵 可以取出若干数字 但是有限制 取出的两个数字不能在八联通方向上相邻 数据范围 1 ≤ N , M ≤ 6 , 1 ≤ T ≤ 20 1≤N,M≤6,1≤T≤20 1≤N,M≤6,1≤T≤20 思…...
DeepSeek 多模态大模型 Janus-Pro 本地部署教程
下载模型仓库 git clone https://github.com/deepseek-ai/Janus.git 国内下载仓库失败时,可以使用以下代理: git clone https://github.moeyy.xyz/https://github.com/deepseek-ai/Janus.git 准备 Conda 3.12 虚拟环境 conda create --name deepseek7B p…...
【prompt实战】知乎问题解答专家
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权&am…...
6. MySQL 索引的数据结构(详细说明)
6. MySQL 索引的数据结构(详细说明) 文章目录 6. MySQL 索引的数据结构(详细说明)1. 为什么使用索引2. 索引及其优缺点2.1 索引概述 3. InnoDB中索引的推演3.1 索引之前的查找3.2 设计索引3.3 常见索引概念1. 聚簇索引2. 二级索引(辅助索引、非聚簇索引)…...
pytorch 50 大模型导出的onnx模型优化尝试
本博文基于Native-LLM-for-Android项目代码实现,具体做了以下操作: 1、尝试并实现将模型结构与权重零散的onnx模型进行合并,通过该操作实现了模型加载速度提升,大约提升了3倍 2、突破了onnxconverter_common 无法将llm模型导出为fp16的操作,基于该操作后将10g的权重降低到…...
LeetCode1871 跳跃游戏VII
LeetCode 跳跃游戏 IV:二进制字符串的跳跃问题 题目描述 给定一个下标从 0 开始的二进制字符串 s 和两个整数 minJump 和 maxJump。初始时,你位于下标 0 处(保证该位置为 0)。你需要判断是否能到达字符串的最后一个位置…...
RabbitMQ 从入门到精通
1 MQ架构设计原理 1.1 什么是消息中间件 消息中间件基于队列模型实现异步/同步传输数据 作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合度。 1.2 传统的http请求存在那些缺点 1.Http请求基于请求与响应的模型,在高并发的情况下,…...
考研复试c语言常见问答题汇总2
11. 关键字和一般标识符有什么不同? C语言中关键字与一般标识符区别: 定义:关键字是C语言预定义的特殊单词(如int、for),有固定含义;标识符是自定义的名称(如变量名、函数名…...
Qt表格美化笔记
介绍 表格是一种常见的数据管理界面形式,在大批量的数据交互情形下使用的比较多 表格 可以通过样式表设置线条以及边框的颜色 QTableWidget { gridline-color : rgb(55, 60, 62); border: 1px solid rgb(62,112,181);}表头 如果表头和第一行的分割线显示&#…...
致远互联FE协作办公平台 存在SQL注入漏洞(DVB-2025-8942)
免责声明 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x01…...
一、docker的安装
一、docker桌面 二、docker的配置文件 1、docker配置文件位置/etc/docker/daemon.json 使用json格式,graphdata-root {"graph":"/deploy/docker","registry-mirrors": ["https://8auvmfwy.mirror.aliyuncs.com"],"…...
