JOLT 转换:如何有条件地合并两个字段并保留其他属性?

问题描述 投票:0回答:1

我正在进行 JOLT 转换,其中需要合并两个字段:AccountNumber 和 EntityID,仅保留非空值。在我的输入中,这些字段之一始终具有值,但绝不会同时具有值。此外,我想在输出中保留其他相关属性。

这是我使用虚拟数据简化输入 JSON 的示例:

{
  "AccountNumber": "123456",
  "EntityID": "",
  "TransactionYear": "2023",
  "TransactionMonth": "03",
  "TransactionDay": "05",
  "TransactionHour": "10",
  "TransactionMinutes": "15",
  "TransactionSeconds": "30",
  "ComponentNumber": "12345",
  "Price": "250.00",
  "CurrencyCode": "USD"
}

目标: 合并 AccountNumber 和 EntityID,仅保留非空值。由于这些字段之一始终包含一个值,因此我希望输出能够反映该值而不创建数组。 保留其他属性:在输出中保留 TransactionYear、TransactionMonth、TransactionDay、TransactionHour、TransactionMinutes、TransactionSeconds、ComponentNumber、Price 和CurrencyCode。

这是我正在使用的 JOLT 规格:

[{
      "operation": "shift",
      "spec": {
        "AccountNumber": "Temp.AccountNumber",
        "EntityID": "Temp.EntityID",
        "TransactionYear": "TransactionData.TransactionYear",
        "TransactionMonth": "TransactionData.TransactionMonth",
        "TransactionDay": "TransactionData.TransactionDay",
        "TransactionHour": "TransactionData.TransactionHour",
        "TransactionMinutes": "TransactionData.TransactionMinutes",
        "TransactionSeconds": "TransactionData.TransactionSeconds",
        "ComponentNumber": "NewPrice.ComponentNumber",
        "Price": "NewPrice.SpecialPrice.Price",
        "CurrencyCode": "NewPrice.SpecialPrice.CurrencyCode"
      }
    },
    {
      "operation": "modify-overwrite-beta",
      "spec": {
        "AccountNumber": "=firstNotNull(@(1,Temp.AccountNumber), @(1,Temp.EntityID))"
      }
    },
    {
      "operation": "remove",
      "spec": {
        "Temp": ""
      }
    }]

问题: 我得到的输出仍然包含 AccountNumber 作为数组:

{
  "AccountNumber": [ "", "123456" ],
  "TransactionData": {
    "TransactionYear": "2023",
    "TransactionMonth": "03",
    "TransactionDay": "05",
    "TransactionHour": "10",
    "TransactionMinutes": "15",
    "TransactionSeconds": "30"
  },
  "NewPrice": {
    "ComponentNumber": "12345",
    "SpecialPrice": {
      "Price": "250.00",
      "CurrencyCode": "USD"
    }
  }
}

期望的输出: 我希望 AccountNumber 是单个值(AccountNumber 或 EntityID),而不是数组,同时保留所有其他属性:

 {
         "AccountNumber": "123456",
         "TransactionData": {
           "TransactionYear": "2023",
           "TransactionMonth": "03",
           "TransactionDay": "05",
           "TransactionHour": "10",
           "TransactionMinutes": "15",
           "TransactionSeconds": "30"
         },
         "NewPrice": {
           "ComponentNumber": "12345",
           "SpecialPrice": {
             "Price": "250.00",
             "CurrencyCode": "USD"
           }
         }
       }

问题: 如何修改 JOLT 规范以确保仅保留 AccountNumber 和 EntityID 之间的第一个非空值而不生成数组,同时仍保留所有其他属性?

提前谢谢您!

jolt
1个回答
0
投票

您可以使用以下转换规范:

[
  {
    "operation": "shift",
    "spec": {
      "AccountNumber|EntityID": "Temp.AccountNumber",
      "*tion*": "&(0,1)tionData.&", //TransactionData 
      "*": "NewPrice.&" //others
    }
  },
  {//combine the components of the "AccountNumber" array 
    "operation": "modify-overwrite-beta",
    "spec": {
      "Temp": {
        "AccountNumber": "=join('',@(1,&))"
      }
    }
  }
]

网站上的演示使用v0.1.1的Jolt Transform演示是:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.