簡體   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