
1. 引言:Jolt 简介
jolt 是一种强大的 json 数据转换工具,它允许开发者通过定义一系列规范(spec)来重塑、过滤、转换和聚合 json 数据。在处理异构数据源集成、api 网关数据转换或数据管道预处理等场景中,jolt 能够以声明式的方式高效完成复杂的 json 结构调整。本教程将通过一个具体案例,演示如何利用 jolt 处理包含动态数组的复杂 json 结构,并实现关键字段的数据类型转换。
2. 复杂 JSON 转换场景分析
我们面临的挑战是将一个嵌套的输入 JSON 结构转换为一个扁平化且满足特定格式要求的输出 JSON。
2.1 输入数据结构
输入 JSON 包含 Entity 对象,其中嵌套了 card 和 Photos 数组。Photos 数组的长度是动态的,可能包含任意数量的元素。
{
"Entity": {
"card": {
"cardNo": "123456789",
"cardStatus": "10",
"cardAddress": "UK",
"cardAddress1": "US",
"cardCity": "mk",
"name": "RAM",
"lastName": "ABU",
"name1": "RAM1",
"lastName1": "ABU1"
},
"Photos": [
{
"Id": 327703,
"Caption": "TEST>> photo 1",
"Url": "http://bob.com/0001/327703/photo.jpg"
},
{
"Id": 327704,
"Caption": "TEST>> photo 2",
"Url": "http://bob.com/0001/327704/photo.jpg"
},
{
"Id": 327704,
"Caption": "TEST>> photo 2",
"Url": "http://bob.com/0001/327704/photo.jpg"
}
]
}
}2.2 目标输出结构
期望的输出 JSON 结构如下。需要注意以下几点:
- card 中的部分字段被提取并重命名到 tab.text 和 address 数组中。
- Photos 数组不仅包含原始 Photos 数组的元素,还额外增加了两个固定条目。
- 最关键的是,Photos 数组中每个对象的 no 字段,其原始值为数值类型(Id),但在输出中必须是字符串类型。
{
"tab": {
"text": "123456789"
},
"address": [
{
"add": "UK",
"add2": "US",
"mk": "mk"
}
],
"Photos": [
{
"caption2": "http.1.com",
"no": "222444"
},
{
"caption2": "http.2.com",
"no": "222444"
},
{
"caption2": "TEST>> photo 1",
"no": "327703"
},
{
"caption2": "TEST>> photo 2",
"no": "327704"
},
{
"caption2": "TEST>> photo 2",
"no": "327704"
}
]
}3. Jolt shift 操作:结构重塑与数据提取
shift 操作是 Jolt 中最常用的操作之一,用于将输入 JSON 中的数据按照指定的路径映射到输出 JSON 的新路径。它负责数据的选择、重命名和结构调整。
3.1 第一次 shift:扁平化与初步映射
第一个 shift 规范负责从 Entity.card 中提取字段并将其映射到 tab 和 address,同时对 Photos 数组进行初步处理,包括生成额外的固定条目。
[
{
"operation": "shift",
"spec": {
"Entity": {
"card": {
"cardNo": "tab.text",
"cardAddress": "address[0].add",
"card










