有效负载数组中的动态字段在AJO推送通知中失败
在Adobe Journey Optimizer (AJO)中,推送通知无法呈现有效负载数组(如“callerName"”)中的动态字段,即使相同的数据在电子邮件和短信中也可正常使用。 字段可能显示为空白或以十六进制代码显示特殊字符。 要解决此问题,请简化表达式,尽可能扁平化有效负载,并确保端到端地保留UTF-8编码。
描述 description
环境
产品: Adobe Journey Optimizer (AJO)
渠道:推送(通过APN的iOS、通过FCM的Android)
问题/症状
推送通知中基于数组的字段的动态个性化失败。
重现问题的步骤
-
在AJO中创建触发推送通知的历程。
-
传递一个有效负载,其中个性化属性是数组的一部分,例如:
code language-none { "attribute_list_group": [ { "name": "callerName", "value": "Bill Robert" } ] } -
在推送通知标题/正文中,配置个性化表达式:
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 -
发送通知。
注意:在移动设备上,字段显示为空白或显示特殊字符的十六进制代码。 相同的表达式在电子邮件和短信渠道中可正常使用。
原因
- 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()
- JavaScript中的
-
使用JSONLint等工具验证负载
-
避免双重转义或双重序列化
-
使用多语言和emoji字符进行测试以确保正确呈现
相关阅读
- AJO指南中的推送通知中的Personalization
- AJO指南中的Personalization用例
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f