[英]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"
}
}
}
]
}
我尝试了多个 jolt 规范,但无法提出所需的输出。 理想的震动规格应该是什么?
这个规范应该使用移位操作应该工作:
[
{
"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
,尤其是"&"
和"*"
通配符
编辑 #2:考虑otherDetails
评论:您也可以这样处理它:
...
"team": {
"id": "allocDetails[&2].team.id",
"name": "allocDetails[&2].team.name",
"product": {
"otherDetails": null,
"*": "allocDetails[&3].team.product.&"
}
}
...
以上:将所有products
的部分键(由"*"
匹配)放到具有相同名称( "&"
)的键中,放在"allocDetails[&3].team.product"
输出 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"
}
}
}
}
}
}
}
}
]```
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.