Azure Logic App中Compose转字符串,需保留float类型问题
解决Power Automate中JSON数字类型丢失导致API请求被拒的问题
问题分析
核心问题是Parse JSON后的数字字段在Compose动作中被转为字符串,即便用float()转换,HTTP POST时仍保持字符串类型,导致API因类型错误拒绝请求。这通常源于Parse JSON的Schema定义错误、Compose输出格式不当,或是HTTP请求序列化方式问题。
解决方案
1. 修正Parse JSON的Schema定义
检查Parse JSON动作的Schema,确保Kontraktsarea字段被定义为number类型,而非string:
{ "type": "object", "properties": { "Kontraktsarea": { "type": "number" // 此处必须设为number,不能是string }, // 其他字段定义... } }
若Schema是自动生成的,可能误将带小数的数值识别为字符串,手动修改类型即可从源头规避类型错误。
2. 直接在HTTP请求体中使用类型转换(推荐)
跳过Compose中间层,直接在HTTP POST的请求体中编写表达式,确保数字类型不丢失:
{ "livingspace": float(items('For_each')?['Kontraktsarea']), "otherField1": items('For_each')?['OtherField1'], "otherField2": items('For_each')?['OtherField2'] // 其他所需字段 }
这种方式避免了Compose动作可能带来的额外序列化,确保livingspace以number类型发送给API。
3. 正确使用Compose动作(若必须保留)
如果一定要用Compose组合字段,不要用字符串拼接生成JSON,而是用createObject()函数生成真正的JSON对象:
createObject( 'livingspace', float(items('For_each')?['Kontraktsarea']), 'otherField1', items('For_each')?['OtherField1'], 'otherField2', items('For_each')?['OtherField2'] )
之后在HTTP POST中直接引用outputs('Compose')作为请求体,此时livingspace会保持number类型。
4. 验证HTTP请求的Content-Type
确保HTTP POST动作的Headers中设置了:
Content-Type: application/json
若缺少这个头,Power Automate可能会以表单格式发送数据,导致数字被转为字符串。
验证方法
可以在Compose动作后添加一个额外的Compose动作,输入表达式:
typeof(outputs('Compose')?['livingspace'])
如果输出为Number,说明类型正确;若输出为String,则需要检查前面的步骤是否正确执行。
内容的提问来源于stack exchange,提问作者Sanktas
相关产品推荐
相关产品推荐

