在处理accepts_marketing和email_marketing_consent字段时如何使用JOLT正确转换JSON输入?

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

我正在使用 JOLT 转换,该转换获取输入 JSON 对象并将其转换为新结构,但我需要处理输入中同时存在accepts_marketing 和 email_marketing_consent 或只有其中之一可用的情况。

输入 JSON 示例:

{
  "email": "[email protected]",
  "first_name": "John",
  "accepts_marketing": false,
  "email_marketing_consent": {
    "state": "not_subscribed",
    "opt_in_level": "single_opt_in",
    "consent_updated_at": null
  }
}

预期输出:

{
  "optin_newsletter": false,
  "email": "[email protected]",
  "first_name": "John"
}

当前 JOLT 改造:

[
  {
    "operation": "shift",
    "spec": {
      "accepts_marketing": "optin_newsletter",
      "email_marketing_consent": {
        "state": {
          "subscribed": {
            "#true": "optin_newsletter"
          },
          "*": {
            "#false": "optin_newsletter"
          }
        }
      },
      "email": "email",
      "first_name": "first_name"
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "subscribed": "=toBoolean"
    }
  }
]

问题:

  1. 当输入中同时存在accepts_marketing 和 email_marketing_consent 时,optin_newsletter 的输出将变成一个数组:[ false, "false" ],但我希望它是一个简单的 false 值。

  2. 当输入中仅存在一个字段(accepts_marketing 或 email_marketing_consent)时,我希望输出仅反映该值,没有重复或错误。

问题:

1. 如何处理同时存在accepts_marketing 和email_marketing_consent 且我只想要optin_newsletter 的单个布尔值(而不是值数组)的情况?

2. 如果仅存在accepts_marketing或仅email_marketing_consent,我如何确保转换为optin_newsletter产生正确的值?

3. 如何修改 JOLT 规范以有条件地使用这些字段之一,或者在两个字段都可用时优先考虑其中一个字段?

其他详细信息:

目标是 optin_newsletter 字段始终为布尔值(true 或 false),即使两个字段(accepts_marketing 和 email_marketing_consent)都存在。

我正在尝试将 email_marketing_consent.state 值(例如“subscribed”和“not_subscribed”)转换为布尔值(分别为 true 和 false)以保持一致性。

java transform jolt
1个回答
0
投票

看看以下规范是否有效:

[
  {
    "operation": "shift",
    "spec": {
      "email": "&",
      "first_name": "&",
      "accepts_marketing": "option_newsletter",
      "email_marketing_consent": {
        "state": {
          "subscribed": {
            "true": "option_newsletter"
          },
          "*": {
            "#false": "option_newsletter"
          }
        }
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "option_newsletter": "ONE"
    }
  },

  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "option_newsletter": "=toBoolean"
    }
  }

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