繁体   English   中英

使用 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"
        }
      }
    }
  ]
}

我尝试了多个 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 中的什么位置。

  1. 规范中的每个键-值对定义了源-目标关系。 例如(让我们从最简单的开始):来自["item"]["name"]将落在输出 JSON 中的["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 ,尤其是"&""*"通配符


编辑 #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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM