Azure APIM中Liquid模板如何从嵌套JSON提取GROUP(tranid)等特定值
Azure APIM Liquid模板提取含特殊字符键值的解决方案
问题原因
Liquid解析器默认会将带括号的键名(如GROUP(tranid))识别为方法调用语句,而非普通字符串键名,因此直接使用点语法(values.GROUP(tranid))访问时会返回空值。
可行解决方案
方案1:方括号+字符串字面量直接访问(推荐)
对于包含特殊字符的键名,使用['键名']的语法替代点语法即可精准读取。
示例输入JSON结构
{ "data": [ { "values": { "GROUP(tranid)": "TXN2024001", "amount": "99.00", "createTime": "2024-05-20 12:00:00" } } ] }
对应Liquid模板写法
{% for item in body.data %} { "tranId": "{{ item.values['GROUP(tranid)'] }}", "payAmount": "{{ item.values['amount'] }}", "createTime": "{{ item.values['createTime'] }}" } {% endfor %}
方案2:遍历键值对匹配读取(兼容旧版APIM)
如果使用方括号语法仍返回空值(部分旧版本APIM的Liquid实现存在兼容问题),可以通过遍历values节点的所有键值对,匹配目标键名后取值。
示例模板
{% for item in body.data %} {% assign targetTranId = "" %} {% for keyValue in item.values %} {% if keyValue[0] == "GROUP(tranid)" %} {% assign targetTranId = keyValue[1] %} {% break %} {% endif %} {% endfor %} { "tranId": "{{ targetTranId }}" } {% endfor %}
注意事项
- 必须在APIM的
set-body策略中显式指定template="liquid",否则模板不会被正确解析:<set-body template="liquid"> <!-- 此处放置Liquid模板内容 --> </set-body> - 键名字符串的大小写必须与源JSON完全一致,Liquid的键名匹配为大小写敏感
- 如果values节点为数组类型,需要先指定数组下标再访问键值,例如
{{ item.values[0]['GROUP(tranid)'] }}
内容的提问来源于stack exchange,提问作者Thomas M
相关产品推荐
相关产品推荐

