??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.pswp.cn/diannao/73322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73322.shtml
英文地址,請注明出處:http://en.pswp.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…