在Azure Logic App中反序列化ServiceBus消息内容遇阻
解决Azure Logic App读取ServiceBus消息时的序列化前缀问题
我之前也碰到过一模一样的问题!你解码后看到的@string3http://schemas.microsoft.com/2003/10...前缀,是因为这条ServiceBus消息是用DataContractSerializer序列化字符串类型内容导致的——这个序列化工具会自动给字符串加上类型标识前缀,所以解码后就带出了这部分额外内容。下面给你两个快速解决的方法:
方式1:用Split函数提取有效JSON内容
如果解码后的字符串格式是 @string3<schema-url>"你的实际JSON内容",直接用双引号分割后取中间的JSON部分就行:
@{json(split(base64ToString(triggerBody()?['ContentData']), '"')[1])}
原理很简单:按双引号把字符串分成三部分,取索引为1的元素就是你要的纯净JSON字符串,再用json()转成Logic App可操作的对象。
方式2:用Replace函数正则匹配移除前缀
如果前缀里的schema URL有细微变化,用正则匹配更稳妥,直接把开头的标识部分替换为空:
@{json(replace(base64ToString(triggerBody()?['ContentData']), '^@string3http://schemas.microsoft.com/2003/10/Serialization/.*?"', ''))}
这个正则会精准匹配从字符串开头到第一个双引号的所有前缀内容,替换后剩下的就是干净的业务JSON。
额外说明
这个前缀本质是DataContractSerializer的类型标记——当发送消息时,如果是把JSON字符串当成字符串类型序列化(而非直接序列化JSON对象),就会自动加上这个标记。如果之后有机会调整消息发送端,改成直接发送JSON对象(而非序列化后的字符串),后续解码就不会再碰到这个问题了。
内容的提问来源于stack exchange,提问作者Andrew Williamson
相关产品推荐
相关产品推荐

