⚡️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}}
}

高级技巧

  1. 动态键名:使用 & 引用输入字段的值作为键:
{"operation": "shift","spec": {"userType": "output.&"  // 将 userType 的值作为键}
}

输入 { “userType”: “admin” } → 输出 { “output”: { “admin”: “admin” } }。

  1. ​条件逻辑:通过 modify 系列操作符实现复杂条件:
{"operation": "modify-overwrite-beta","spec": {"output.discount": "=if (@(1,price) > 100) then 0.1 else 0"}
}
  1. ​数组聚合:将多个字段合并为数组:
{"operation": "shift","spec": {"tags": "output.tags[]"}
}

注意事项

  • 大小写敏感:字段名和路径严格区分大小写。
  • ​路径不存在:若输入路径不存在,操作符会静默忽略。
  • 性能优化:复杂嵌套或通配符可能影响性能,尽量简化规则。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

47.全排列 II

47.全排列 II 力扣题目链接 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出…

centos没有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

04 1个路由器配置一个子网的dhcp服务

前言 这是最近一个朋友的 ensp 相关的问题, 这里来大致了解一下 ensp, 计算机网络拓扑 相关基础知识 这里一系列文章, 主要是参照了这位博主的 ensp 专栏 这里 我只是做了一个记录, 自己实际操作了一遍, 增强了一些 自己的理解 当然 这里仅仅是一个 简单的示例, 实际场景…

网络空间安全(31)安全巡检

一、定义与目的 定义&#xff1a; 安全巡检是指由专业人员或特定部门负责&#xff0c;对各类设施、设备、环境等进行全面或重点检查&#xff0c;及时发现潜在的安全隐患或问题。 目的&#xff1a; 预防事故发生&#xff1a;通过定期的安全巡检&#xff0c;及时发现并解决潜在的…

在IGH ethercat主站中Domain和Entry之间的关系

在 IGH EtherCAT 主站中&#xff0c;“domain”&#xff08;域&#xff09;和 “entry”&#xff08;条目&#xff09;存在着紧密的关系&#xff0c;具体如下&#xff1a; 数据组织与管理方面&#xff1a;“domain” 是 EtherCAT 主站中用于管理和处理从站配置、数据映射和数据…

信息学奥赛一本通 1449:【例题2】魔板

题目 1449&#xff1a;【例题2】魔板 分析 首先注意&#xff1a;输入是按顺时针给出的&#xff0c;但我们处理时需要按正常顺序排&#xff0c;可以用以下代码读入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…

【xv6操作系统】系统调用与traps机制解析及实验设计

【xv6操作系统】系统调用与traps机制解析及实验设计 系统调用相关理论系统调用追溯系统调用实验设计Sysinfo&#x1f6a9;系统调用总结&#xff08;结合trap机制&#xff09; traptrap机制trap代码流程Backtrace实验alarm实验 系统调用 相关理论 隔离性&#xff08;isolation)…

Docker文件夹上传秘籍Windows下的高效传输之道

哈喽,大家好,我是木头左! 一、理解Docker容器与Windows文件系统的差异 在深入探讨如何从 Windows 系统将文件夹及递归文件夹和文件上传到 Docker 容器之前,有必要先明晰 Docker 容器与 Windows 文件系统之间存在的本质差异。 (一)Docker 容器的文件系统特性 Docker 容…

08 | 实现版本号打印功能

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中&#xff0c;picker 和 select 都是用户交互中用于选择的组件&#xff0c;但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述&#xff1a; picker 是微信小程序中的原生组件&#xff0c;通常用于选择单项或多项值&#xff0c;如时…

PMP 证书的含金量怎么样?

pmp含金量&#xff0c;这是一个很有争议的话题&#xff0c;我根据我以往的面试跟工作经历对 PMP 也有几点看法&#xff0c;想跟大家聊一聊。 一、如果真心想做项目管理&#xff0c;PMP 一定要去考一个 现在的早已不是凭经验做项目的时代了&#xff0c;各大企业都追求专业式的…

Springboot连接neo4j

​一、Spring Data Neo4j 核心知识体系 ​1. 核心概念 ​图数据库特性&#xff1a; 数据以 ​节点&#xff08;Node&#xff09;​ 和 ​关系&#xff08;Relationship&#xff09;​ 形式存储&#xff0c;支持属性&#xff08;Property&#xff09;。查询语言&#xff1a;Cyp…

我与DeepSeek读《大型网站技术架构》- 大型网站架构技术一览与Web开发技术发展历程

文章目录 大型网站架构技术一览1. 前端架构2. 应用层架构3. 服务层架构4. 存储层架构5. 后台架构6. 数据采集与监控7. 安全架构8. 数据中心机房架构 Web开发技术发展历程一、静态HTML阶段二、CGI脚本模式阶段三、服务器页面模式阶段 大型网站架构技术一览 1. 前端架构 浏览器…

Python数据类型进阶——详解

—— 小 峰 编 程 目录 1.整型 1.1 定义 1.2 独有功能 1.3 公共功能 1.4 转换 1.5 其他 1.5.1 长整型 1.5.2 地板除(除法&#xff09; 2. 布尔类型 2.1 定义 2.2 独有功能 2.3 公共功能 2.4 转换 2.5 其他 做条件自动转换 3.字符串类型 3.1 定义 3.2 独有功能…

GNU Binutils 全工具指南:从编译到逆向的完整生态

1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1.1. 引言1.2. 工具分类速查表1.3. 核心工具详解 1.3.1. 编译与汇编工具 1.3.1.1. as&#xff08;汇编器&#xff09;1.3.1.2. gcc&#xff08;…

docker python:latest镜像 允许ssh远程

跳转到家目录 cd创建pythonsshdockerfile mkdir pythonsshdockerfile跳转pythonsshdockerfile cd pythonsshdockerfile创建Dockerfile文件 vim Dockerfile将Dockerfile的指令复制到文件中 # 使用 python:latest 作为基础镜像 # 如果我的镜像列表中没有python:latest镜像&…

c++的基础排序算法

一、快速排序 1. 选择基准值&#xff08;Pivot&#xff09; 作用 &#xff1a;从数组中选择一个元素作为基准&#xff08;Pivot&#xff09;&#xff0c;用于划分数组。常见选择方式 &#xff1a; 固定选择最后一个元素&#xff08;如示例代码&#xff09;。随机选择&#xf…

焊接机器人与线激光视觉系统搭配的详细教程

以下是关于焊接机器人与线激光视觉系统搭配的详细教程&#xff0c;包含核心程序框架、调参方法及源码实现思路。本文综合了多个技术文档与专利内容&#xff0c;结合工业应用场景进行系统化总结。 一、系统硬件配置与视觉系统搭建 1. 硬件组成 焊接机器人系统通常由以下模块构…

jmeter分布式原理及实例

一、执行原理 二、相关注意事项 关闭防火墙所有上网控制机、代理机、服务器都在同一个网络上所有机器的jmeter和java版本必须一致关闭RMI.SSL开关 三、配置和执行 配置&#xff1a; 修改bin/jmeter.properties文件&#xff1a; 代理机&#xff1a; 修改服务端口&#xff1…