使用 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.

中的什么位置
  1. 规范中的每个键-值对都定义了源-目标关系。 例如(让我们从最简单的开始):来自 ["item"]["name"] 的值将落在输出 JSON.
  2. 中的 ["name"] 键下
 "items": {
    "*": {
      ...
    }
 }

部分说:“对于 'items' 键下数组的每个元素执行 ...

  1. & 符号运算符 "&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"
                }
              }
            }
          }
        }
      }
    }
  }
]```