有效负载数组中的动态字段在AJO推送通知中失败

在Adobe Journey Optimizer (AJO)中,推送通知无法呈现有效负载数组(如“callerName"”)中的动态字段,即使相同的数据在电子邮件和短信中也可正常使用。 字段可能显示为空白或以十六进制代码显示特殊字符。 要解决此问题,请简化表达式,尽可能扁平化有效负载,并确保端到端地保留UTF-8编码。

描述 description

环境

产品: Adobe Journey Optimizer (AJO)
渠道:推送(通过APN的iOS、通过FCM的Android)

问题/症状

推送通知中基于数组的字段的动态个性化失败。

重现问题的步骤

  1. 在AJO中创建触发推送通知的历程。

  2. 传递一个有效负载,其中个性化属性是数组的一部分,例如:

    code language-none
    {
      "attribute_list_group": [
        {
          "name": "callerName",
          "value": "Bill Robert"
        }
      ]
    }
    
  3. 在推送通知标题/正文中,配置个性化表达式:

    code language-none
    #each context.journey.events.[ eventId] ._tmobile.decision_detail_group.attribute_list_group as |container|
      {%#if contains(container.name, "callerName")%}
        container.value
      {%/if%}
    /each
    
  4. 发送通知。

注意:在移动设备上,字段显示为空白或显示特殊字符的十六进制代码。 相同的表达式在电子邮件和短信渠道中可正常使用。

原因

  • AJO的推送渠道解析器比电子邮件和短信更严格。 它需要纯字符串值,并且对标题或正文中的循环、复杂表达式和非字符串数据类型支持有限。
  • 在推送通知字段中可能不支持模板和帮助程序语法(Handlebars与Nunjucks/Liquid)。
  • 在序列化期间,有效负载中的特殊字符可能会编码为十六进制(例如,\u2019)。 推送服务和某些设备应用程序可能不会解码这些序列,而是按原样显示它们。
  • APN和FCM等推送服务会强制UTF-8编码、拒绝控制字符,并且可能会错误呈现、丢弃或拒绝序列格式不正确或转义的消息。
  • AJO仅支持正确键入的字符串。 如果动态表达式解析为对象、格式错误的字符串或数组,则推送消息可能会以静默方式失败或被截断。

解决方法 resolution

  • 从循环表达式中删除所有空格和新行。 使用压缩版本,如下所示:#each context.journey.events.[ eventId] ._tmobile.decision_detail_group.attribute_list_group as |container|{%#if contains(container.name, "callerName")%}container.value{%/if%}/each 这解决了当前客户实施中的拉丁字符问题。
  • 如果可能,请将callerName移至顶级字段以扁平化有效负载。 然后直接在推送模板中使用event.callerName
  • 如果无法使用拼合,请确保选择了正确的数组索引,并在AJO中测试个性化预览以确认渲染。
  • 确保在每个阶段都保留UTF-8编码 — 从源系统到AJO处理再到推送服务。 避免双重编码或转义特殊字符。
  • 如果特殊字符仍显示为十六进制,则可能是推送渠道或设备渲染的限制。 AJO当前不提供用于在设备上强制解码这些字符的设置。

处理有效负载中的特殊字符和Unicode

在JWT有效负载或个性化数据中传递字符串时,请始终确保正确编码或转义特殊字符并验证Unicode输入。 编码不当会导致呈现问题、解析失败或推送通知中出现空白字段。

正确的JSON字符串编码和字符转义

JSON要求对某些字符进行转义,以确保正确解析有效负载:

字符
转义序列
退格符
\b
换页符
\f
换行符
\n
回车符
\r
Tab
\t
双引号
\”
反斜线
\\

示例:

{
  "message": "Hello\\nWorld! She said, \\\"Hi there!\\\"."
}

代码转义

  • JavaScript: JSON.stringify("Hello\nWorld! She said, \"Hi there!\".")
  • Python: json.dumps("Hello\nWorld! She said, \"Hi there!\".")

Unicode处理

JSON通过UTF-8编码支持Unicode。 字符可以直接表示或使用\uXXXX表示法表示:

{
  "emoji": ":grinning:",
  "currency": "€",
  "chinese": "你好",
  "heart": "\u2764"
}

带有特殊字符的有效负载示例:

{
  "scopes": [ "read", "write", "special:áéíóú", "quote:\"test\""] ,
  "user": "John\\nDoe"
}

JWT模块中不受支持或敏感的字符

有效负载必须是有效的JSON。 避免:

  • 未转义的双引号或字符串外部的新行
  • 控制字符(ASCII代码0-31,空白除外)
  • 非UTF-8字节

有关JSON字符编码规则,请参阅RFC 8259第7节。

已知问题:

  • 字段名称中包含逗号、句点和反斜杠
  • 未转义的引号中断解析
  • 控制字符和无效的Unicode序列

Unicode和编码的最佳实践

  • 始终设置标头: Content-Type: application/json; charset=UTF-8

  • 使用标准库进行序列化:

    • JavaScript中的JSON.stringify()
    • Python中的json.dumps()
  • 使用JSONLint等工具验证负载

  • 避免双重转义或双重序列化

  • 使用多语言和emoji字符进行测试以确保正确呈现

相关阅读

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f