Azure Logic Apps队列消息处理:提取参数格式化邮件内容
搞定Azure Logic App邮件正文格式化问题
嗨,我来帮你解决这个邮件正文格式的问题!你现在的代码把解码后的队列内容和ContentType直接拼在一起了,不仅带了一堆多余的前缀,还没正确提取JSON里的字段,所以才会出现那种混乱的内容。咱们一步步来调整:
第一步:先把队列消息里的纯JSON挖出来
你解码后的内容前面有一堆序列化相关的前缀,得先把后面的纯JSON部分提取出来才行。用下面这个表达式就能搞定:
json(substring(base64ToString(triggerBody()?['ContentData']), indexOf(base64ToString(triggerBody()?['ContentData']), '{')))
简单说下这个表达式做了啥:
- 先把队列里的
ContentData(base64编码的内容)解码成字符串 - 找到JSON开始的那个
{符号的位置,从这里开始截取到结尾,就得到纯JSON内容了 - 最后把这段字符串转成Logic App能识别的JSON对象
你可以把这个表达式放到一个Parse JSON动作里,这样后面用起来更方便;要是嫌麻烦,也可以直接在邮件正文里嵌套使用。
第二步:拼接成你想要的邮件格式
有了解析好的JSON对象,咱们就能提取deviceid和x_left字段,拼成目标文本啦。
如果用了Parse JSON动作(假设动作名叫Parse_JSON),邮件正文就这么写:
Your @{outputs('Parse_JSON')?['deviceid']} is and distance is @{outputs('Parse_JSON')?['x_left']} Thanks!
要是不想单独加Parse JSON步骤,直接在邮件正文里写嵌套表达式也行:
Your @{json(substring(base64ToString(triggerBody()?['ContentData']), indexOf(base64ToString(triggerBody()?['ContentData']), '{')))?['deviceid']} is and distance is @{json(substring(base64ToString(triggerBody()?['ContentData']), indexOf(base64ToString(triggerBody()?['ContentData']), '{')))?['x_left']} Thanks!
小补充
你看到的那些前缀,应该是消息用.NET的DataContractSerializer序列化导致的,属于正常情况。要是后续消息的前缀长度固定,你也可以直接用固定长度截取(比如substring(xxx, 70),具体长度自己数一下前缀的字符数),这样效率会稍微高一点。
内容的提问来源于stack exchange,提问作者kimbl
相关产品推荐
相关产品推荐

