使用 Jolt 转换复杂的 Json 数组
Transform complex Json array using Jolt
当调用外部 API 时,我收到一个复杂的 json 结构,我需要根据需要将其转换为简单的 json。我发现 jolt 有能力转换 json 但无法提出 jolt 规格。
我输入的Json数组--
{
"attribute": [
"teamalloc",
"prodAlloc"
],
"item": {
"id": "abcde",
"name": "Champak Kumar",
"allocDetails": {
"updatedAt": "2020-08-10T14:26:48-07:00",
"token": 1134,
"items": [
{
"allocation": 0.2,
"team": {
"id": 90,
"name": "Some Team Name 1",
"createdAt": "2010-01-19T10:52:52-07:00"
}
},
{
"allocation": 0.9,
"team": {
"id": 80,
"name": "Some Team Name 2",
"createdAt": "2010-01-19T10:52:52-07:00",
"product": {
"id": 20,
"name": "Some Product Name 1",
"otherDetails": {
"key": "Id",
"value": "GEC"
}
}
}
},
{
"allocation": 0.1,
"team": {
"id": 10,
"name": "Some Team Name 3",
"createdAt": "2010-01-19T10:52:52-07:00",
"product": {
"id": 22,
"name": "Some Product Name 2",
"otherDetails": {
"key": "Id1",
"value": "GEC1"
}
}
}
}
]
}
}
}
我的输出 Json 结构应该类似于 --
{
"name": "Champak Kumar",
"allocDetails": [
{
"allocation": 0.2,
"team": {
"id": 90,
"name": "Some Team Name 1"
}
},
{
"allocation": 0.9,
"team": {
"id": 80,
"name": "Some Team Name 2",
"product": {
"id": 20,
"name": "Some Product Name 1"
}
}
},
{
"allocation": 0.1,
"team": {
"id": 10,
"name": "Some Team Name 3",
"product": {
"id": 22,
"name": "Some Product Name 2"
}
}
}
]
}
我尝试了多个颠簸规范,但无法得出所需的输出。理想的颠簸规格应该是多少?
这个规范应该使用移位操作应该有效:
[
{
"operation": "shift",
"spec": {
"item": {
"name": "name",
"allocDetails": {
"items": {
"*": {
"allocation": "allocDetails[&1].allocation",
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": "allocDetails[&2].team.product"
}
}
}
}
}
}
}
]
编辑#1:
解释:
移位操作规范定义了我们要将输入 json 中的值放在结果 json.
中的什么位置
- 规范中的每个键-值对都定义了源-目标关系。
例如(让我们从最简单的开始):来自
["item"]["name"]
的值将落在输出 JSON. 中的 ["name"]
键下
"items": {
"*": {
...
}
}
部分说:“对于 'items' 键下数组的每个元素执行 ...
”
- & 符号运算符
"&X"
让我们引用比 LHS(有问题的键)高 X
级的键。例如:
假设我们有 items 数组的第 57 个元素(从 0 开始计数):
...
"name": "allocDetails[&2].team.name"
...
说:“将在 "name"
键下找到的值(即 item["items"][56]["team"]["name"]
中数组的第 57 个元素放在 "allocDetails"
键下。
'*'匹配第57个元素。 '&2' 让我们发现我们正在处理的数组的元素是第 57 个元素。
看看 shift operation javadocs
, especially at the "&"
and "*"
通配符
编辑#2:
考虑 otherDetails
评论:
您也可以这样处理:
...
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": {
"otherDetails": null,
"*": "allocDetails[&3].team.product.&"
}
}
...
以上:将所有 products
' 部分键(由 "*"
匹配)放入 [=29] 中的同名键("&"
) =] 输出 json 的密钥... "otherDetails"
密钥除外。
工作震动规格 --
{
"operation": "shift",
"spec": {
"item": {
"name": "name",
"allocDetails": {
"items": {
"*": {
"allocation": "allocDetails[&1].allocation",
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": {
"id": "allocDetails[&3].team.product.id",
"name": "allocDetails[&3].team.product.name"
}
}
}
}
}
}
}
}
]```
当调用外部 API 时,我收到一个复杂的 json 结构,我需要根据需要将其转换为简单的 json。我发现 jolt 有能力转换 json 但无法提出 jolt 规格。
我输入的Json数组--
{
"attribute": [
"teamalloc",
"prodAlloc"
],
"item": {
"id": "abcde",
"name": "Champak Kumar",
"allocDetails": {
"updatedAt": "2020-08-10T14:26:48-07:00",
"token": 1134,
"items": [
{
"allocation": 0.2,
"team": {
"id": 90,
"name": "Some Team Name 1",
"createdAt": "2010-01-19T10:52:52-07:00"
}
},
{
"allocation": 0.9,
"team": {
"id": 80,
"name": "Some Team Name 2",
"createdAt": "2010-01-19T10:52:52-07:00",
"product": {
"id": 20,
"name": "Some Product Name 1",
"otherDetails": {
"key": "Id",
"value": "GEC"
}
}
}
},
{
"allocation": 0.1,
"team": {
"id": 10,
"name": "Some Team Name 3",
"createdAt": "2010-01-19T10:52:52-07:00",
"product": {
"id": 22,
"name": "Some Product Name 2",
"otherDetails": {
"key": "Id1",
"value": "GEC1"
}
}
}
}
]
}
}
}
我的输出 Json 结构应该类似于 --
{
"name": "Champak Kumar",
"allocDetails": [
{
"allocation": 0.2,
"team": {
"id": 90,
"name": "Some Team Name 1"
}
},
{
"allocation": 0.9,
"team": {
"id": 80,
"name": "Some Team Name 2",
"product": {
"id": 20,
"name": "Some Product Name 1"
}
}
},
{
"allocation": 0.1,
"team": {
"id": 10,
"name": "Some Team Name 3",
"product": {
"id": 22,
"name": "Some Product Name 2"
}
}
}
]
}
我尝试了多个颠簸规范,但无法得出所需的输出。理想的颠簸规格应该是多少?
这个规范应该使用移位操作应该有效:
[
{
"operation": "shift",
"spec": {
"item": {
"name": "name",
"allocDetails": {
"items": {
"*": {
"allocation": "allocDetails[&1].allocation",
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": "allocDetails[&2].team.product"
}
}
}
}
}
}
}
]
编辑#1:
解释: 移位操作规范定义了我们要将输入 json 中的值放在结果 json.
中的什么位置- 规范中的每个键-值对都定义了源-目标关系。
例如(让我们从最简单的开始):来自
["item"]["name"]
的值将落在输出 JSON. 中的
["name"]
键下
"items": {
"*": {
...
}
}
部分说:“对于 'items' 键下数组的每个元素执行 ...
”
- & 符号运算符
"&X"
让我们引用比 LHS(有问题的键)高X
级的键。例如: 假设我们有 items 数组的第 57 个元素(从 0 开始计数):
...
"name": "allocDetails[&2].team.name"
...
说:“将在 "name"
键下找到的值(即 item["items"][56]["team"]["name"]
中数组的第 57 个元素放在 "allocDetails"
键下。
'*'匹配第57个元素。 '&2' 让我们发现我们正在处理的数组的元素是第 57 个元素。
看看 shift operation javadocs
, especially at the "&"
and "*"
通配符
编辑#2:
考虑 otherDetails
评论:
您也可以这样处理:
...
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": {
"otherDetails": null,
"*": "allocDetails[&3].team.product.&"
}
}
...
以上:将所有 products
' 部分键(由 "*"
匹配)放入 [=29] 中的同名键("&"
) =] 输出 json 的密钥... "otherDetails"
密钥除外。
工作震动规格 --
{
"operation": "shift",
"spec": {
"item": {
"name": "name",
"allocDetails": {
"items": {
"*": {
"allocation": "allocDetails[&1].allocation",
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": {
"id": "allocDetails[&3].team.product.id",
"name": "allocDetails[&3].team.product.name"
}
}
}
}
}
}
}
}
]```