需要数据编织帮助进行转换

问题描述

我在下面输入

[
  {
    "CloudAccountDetail": {
      "CompanyCode": "B_B001","CloudAccountId": "a-t-1000-5001-0687-0024","CloudAccountPublicName": "dodp-testcloud","Status": "SUBSCRIbed","ClusterName": "ci.dev.cloudi.city"
    },"NamedSubscriptions": [
      {
        "SubscriptionId": "8f724cc9-bb21-43bc-8911-94d267eb7917","OrderNumber": "TEST708259","StartDate": "2020-01-07T12:13:19.507","ExpiryDate": "2021-01-16T00:00:00","CanceledDate": null,"ProductCode": "ECL-SA-PUSR","ProductName": "Esko Cloud Power User","Assignee": "eskododp03@yahoo.be","AssignedBy": "LicenseService","AssignedDate": "2020-01-07T11:16:52.723","EskoCloudAccount": "a-t-1000-5001-0687-0024","Status": "ACTIVE"
      },{
        "SubscriptionId": "5c06112a-90a4-4e76-b2f4-bd19a1ce92b3","Assignee": null,"AssignedBy": null,"AssignedDate": null,{
        "SubscriptionId": "a258a7fc-cff6-4b53-b19d-4e25a8dbcee6",{
        "SubscriptionId": "e30f16af-de60-4b84-bdae-aa7b6523c316",{
        "SubscriptionId": "5ee9eeb6-9d65-42b8-b594-68c9528ff25b","StartDate": "2020-01-07T12:13:20.507",{
        "SubscriptionId": "818b38f1-0a10-45dc-ae16-f7d804b31cbc",{
        "SubscriptionId": "cf5fc421-8ee0-4f1f-a1ca-e64daef2e0c6","Status": "ACTIVE"
      }
    ],"UnnamedSubscriptions": [
      {
        "SubscriptionId": "c56c5d21-83dd-4df5-851c-52fd5686240b","StartDate": "2020-01-07T13:23:02.593","ProductCode": "ECL-SA-SITE","ProductName": "Share & Approve Site",{
        "SubscriptionId": "1d5bf54c-e812-4c17-830d-d3a1104d66a5",{
        "SubscriptionId": "fbe0bbef-3cc2-451a-9866-0bb31a829850",{
        "SubscriptionId": "368fa144-5a94-4ead-ba69-502ca6419de4",{
        "SubscriptionId": "3404fb6e-d234-4dac-a5a1-96c7534ccf21","StartDate": "2020-01-07T13:23:03.593",{
        "SubscriptionId": "71d88ad6-3108-499e-8be9-3638c7298770",{
        "SubscriptionId": "992b551e-1499-4971-bc9b-34075820faa7","StorageSubscriptions": [
      {
        "EntitlementId": "5ceae026-5c3e-40df-a9f8-2de4f4570566","StorageInGb": 50,"ExpiryDate": "2021-01-07T00:00:00","StartDate": "2020-01-07T12:37:12.697","ProductCode": "ECL-ECL-ST-ST50","ProductName": "Storage Tier 1 (50GB)","TransactionSubscriptions": [
      {
        "EntitlementId": "6eaf4b93-8fef-4423-88fd-7e83d790f6f7","NumberOfTransactions": 12000,"StartDate": "2020-01-07T12:17:56.257","ProductCode": "ECL-ECL-BTR-BTR1000","ProductName": "Basic Transactions Tier 2 (1000/m)","Status": "ACTIVE"
      }
    ]
  },{
    "CloudAccountDetail": {
      "CompanyCode": "B_B001","CloudAccountId": "a-t-1001-0001-0039-0024","CloudAccountPublicName": "Test-Tom-Desmet","NamedSubscriptions": [
      {
        "SubscriptionId": "3dc289af-d469-4dba-875e-354c75d2a31a","OrderNumber": "TEST709894","StartDate": "2020-06-30T14:21:34.773","ExpiryDate": "2021-07-09T00:00:00","AssignedDate": "2020-06-30T13:31:01.777","EskoCloudAccount": "a-t-1001-0001-0039-0024",{
        "SubscriptionId": "3e6818fb-1c4f-4046-9783-5b76d3050eec","StartDate": "2020-06-30T14:21:35.773","UnnamedSubscriptions": [
      {
        "SubscriptionId": "baf3d5c7-b53e-460e-93a5-311b95924fca","StartDate": "2020-06-30T15:18:15.593",{
        "SubscriptionId": "69071fd1-59b5-44ef-a594-95141d68ef4c","StartDate": "2020-06-30T15:18:16.593","StorageSubscriptions": [
      {
        "EntitlementId": "f6f444e3-4dea-43d9-afc0-19d24200cf46","ExpiryDate": "2021-06-30T00:00:00","StartDate": "2020-06-30T14:57:54.05","TransactionSubscriptions": [
      {
        "EntitlementId": "22d25390-4183-4c89-8461-38ebf048812f","StartDate": "2020-06-30T14:24:10.017","Status": "ACTIVE"
      }
    ]
  }
]

我需要的输出如下。我无法创建分隔数组中的元素。

[
  {
    "key": "8f724cc9-bb21-43bc-8911-94d267eb7917","expiryDate": "2021-01-16"
  },{
    "key": "5c06112a-90a4-4e76-b2f4-bd19a1ce92b3",{
    "key": "a258a7fc-cff6-4b53-b19d-4e25a8dbcee6",{
    "key": "e30f16af-de60-4b84-bdae-aa7b6523c316",{
    "key": "5ee9eeb6-9d65-42b8-b594-68c9528ff25b",{
    "key": "818b38f1-0a10-45dc-ae16-f7d804b31cbc",{
    "key": "cf5fc421-8ee0-4f1f-a1ca-e64daef2e0c6",{
    "key": "c56c5d21-83dd-4df5-851c-52fd5686240b","expiryDate": "2021-01-16","cloudPublicName": "dodp-testcloud","cloudAccountId": "a-t-1000-5001-0687-0024"
  },{
    "key": "1d5bf54c-e812-4c17-830d-d3a1104d66a5",{
    "key": "fbe0bbef-3cc2-451a-9866-0bb31a829850",{
    "key": "368fa144-5a94-4ead-ba69-502ca6419de4",{
    "key": "3404fb6e-d234-4dac-a5a1-96c7534ccf21",{
    "key": "71d88ad6-3108-499e-8be9-3638c7298770",{
    "key": "992b551e-1499-4971-bc9b-34075820faa7",{
    "key": "3dc289af-d469-4dba-875e-354c75d2a31a","expiryDate": "2021-07-09"
  },{
    "key": "3e6818fb-1c4f-4046-9783-5b76d3050eec",{
    "key": "baf3d5c7-b53e-460e-93a5-311b95924fca","expiryDate": "2021-07-09","cloudPublicName": "Test-Tom-Desmet","cloudAccountId": "a-t-1001-0001-0039-0024"
  },{
    "key": "69071fd1-59b5-44ef-a594-95141d68ef4c","cloudAccountId": "a-t-1001-0001-0039-0024"
  }
  
]

解决方法

由于转换数据的规则尚不明确,我做了自己的尝试,似乎产生了预期的结果:

%dw 2.0
output application/json
---
flatten (
    payload map (item,order) -> (
        flatten ( [
            item.NamedSubscriptions map {
                key: $.SubscriptionId,expiryDate: $.ExpiryDate as Date
            },item.UnnamedSubscriptions map {
                key: $.SubscriptionId,expiryDate: $.ExpiryDate as Date,cloudPublicName: item.CloudAccountDetail.CloudAccountPublicName,cloudAccountId: item.CloudAccountDetail.CloudAccountId
            }
        ] )
    )  
)
,

使用 flatten 将删除数组的额外级别。

示例:

%dw 2.0
fun getSubscription(items) =
    (items default []) map {
        "key": $.SubscriptionId,"expiryDate": $.ExpiryDate as Date
    }
fun getUnsubscriptions(items,id,name) = 
    (items default []) map {
        "key": $.SubscriptionId,"expiryDate": $.ExpiryDate as Date,"cloudPublicName": name,"cloudAccountId": id
    }
output application/json
---
flatten (payload map (getSubscription($.NamedSubscriptions) ++ 
    getUnsubscriptions($.UnnamedSubscriptions,$.CloudAccountDetail.CloudAccountId,$.CloudAccountDetail.CloudAccountPublicName)))

使用功能 fun 将使其更整洁和可读性。

使用 flatMap 并重复使用一个函数来提取Named和UnnamedS订阅。

%dw 2.0
fun getData(items,account,isUnnamedSubscriptions) = 
    (items default []) map {
        "key": $.SubscriptionId,("cloudPublicName": account.CloudAccountPublicName) if (isUnnamedSubscriptions),("cloudAccountId": account.CloudAccountId) if (isUnnamedSubscriptions)
    }
output application/json
---
payload map (
    getData($.NamedSubscriptions,$.CloudAccountDetail,false)
    ++
    getData($.UnnamedSubscriptions,true)
) flatMap () -> $