如何解决Platform Event富文本字段存储JSON带转义反斜杠问题
Platform Event存储JSON出现多余转义反斜杠的解决方案
问题根因
你遇到的转义问题是**富文本字段(Rich Text Area)**的固有特性导致的:富文本字段为了支持HTML格式渲染,会自动对存储内容中的双引号、尖括号等特殊字符做转义处理,你直接存入原生JSON字符串时,引号前就会被自动加上反斜杠。
解决方案
方案1:替换字段类型(最优方案)
将当前使用的富文本字段替换为长文本字段(Long Text Area),长文本字段不会对存储内容做额外的格式转义:
- 你直接把
JSON.serialize()生成的JSON字符串赋值给长文本字段即可 - 后续从Platform Event中读取该字段时,拿到的就是原生无转义的JSON,可以直接反序列化使用
注意:Platform Event的长文本字段最大支持32768字符,如果你的JSON长度超出限制,可以选择拆分多条事件发布,或者参考方案3做编码压缩。
方案2:保留富文本字段,读取时做转义还原
如果业务需求必须使用富文本字段,你可以在读取字段值后调用Salesforce的字符串方法做转义还原,示例代码:
// 从Platform Event实例中读取带转义的JSON字符串 String escapedJson = eventInstance.ContactRichTextField__c; // 移除转义字符得到原生JSON String rawJson = escapedJson.unescapeHtml4(); // 正常反序列化得到联系人列表 List<ContactWrapper> contactList = (List<ContactWrapper>) JSON.deserialize(rawJson, List<ContactWrapper>.class);
方案3:Base64编码后存储(适合超大JSON场景)
如果你的JSON长度超出长文本字段限制,可以在存储前做Base64编码,避免转义的同时压缩内容长度:
- 存储时代码:
String contactJson = JSON.serialize(contactList); String encodedContent = EncodingUtil.base64Encode(Blob.valueOf(contactJson)); eventInstance.ContactLongTextField__c = encodedContent;
- 读取时代码:
String encodedContent = eventInstance.ContactLongTextField__c; String rawJson = EncodingUtil.base64Decode(encodedContent).toString(); List<ContactWrapper> contactList = (List<ContactWrapper>) JSON.deserialize(rawJson, List<ContactWrapper>.class);
额外排查点
如果你已经使用长文本字段仍出现转义,需要检查代码是否存在双重序列化操作:不要把JSON.serialize()生成的JSON字符串,再次作为某个对象的属性后二次调用JSON.serialize(),这种操作也会导致JSON被额外加转义符。
内容的提问来源于stack exchange,提问作者Pinki Shaw
相关产品推荐
相关产品推荐

