Azure Logic App中JSON转XML时如何阻止元素按字母顺序排序
解决Azure Logic App中JSON转XML时元素顺序被自动排序的问题
我之前也碰到过一模一样的问题——Azure Logic App内置的xml()函数在转换JSON时,会自动把XML元素按字母顺序排列,完全打乱了原JSON里的元素顺序。核心原因是:json()函数解析JSON字符串后,底层用的是无序的键值对存储结构,后续xml()转换时就会默认按字母排序输出元素。要解决这个问题,我们得绕过内置函数的自动排序逻辑,下面给两个实用的方案:
方案一:用Liquid模板实现有序转换
Liquid模板是Logic App里处理JSON到XML转换的绝佳工具,它能严格保留JSON的元素顺序(只要你的原始JSON是有序的)。步骤如下:
创建Liquid模板
针对你提供的JSON结构,编写对应的Liquid模板,遍历JSON属性时会完全遵循原顺序:<Employees> {% for employee in content.Employee %} <Employee> {% if employee.Company %} <Company> {% for company in employee.Company %} {% for key in company %} {% if key == 'CompanyType' %} <CompanyType> {% for ctItem in company[key] %} {% for ctKey in ctItem %} <{{ ctKey }}>{{ ctItem[ctKey] }}</{{ ctKey }}> {% endfor %} {% endfor %} </CompanyType> {% else %} <{{ key }}>{{ company[key] }}</{{ key }}> {% endif %} {% endfor %} {% endfor %} </Company> {% endif %} {% if employee.EmailAddress %} <EmailAddress>{{ employee.EmailAddress }}</EmailAddress> <GivenName>{{ employee.GivenName }}</GivenName> <MobilePhoneNumber>{{ employee.MobilePhoneNumber }}</MobilePhoneNumber> <EndDate>{{ employee.EndDate }}</EndDate> <Surname>{{ employee.Surname }}</Surname> <Updated>{{ employee.Updated }}</Updated> {% endif %} </Employee> {% endfor %} </Employees>在Logic App中使用Liquid转换
- 如果你的Logic App关联了Integration Account,直接添加
Liquid Transformation动作,将你的JSON变量作为输入,选择刚才创建的Liquid模板即可。 - 要是没有Integration Account,也可以用
Compose动作配合内联Liquid(需确保Logic App环境支持),或者用Azure Function托管Liquid转换逻辑,灵活性更高。
- 如果你的Logic App关联了Integration Account,直接添加
方案二:手动拼接XML字符串(适合固定结构场景)
如果你的JSON结构固定、不复杂,也可以直接用concat()函数手动拼接XML字符串,完全掌控元素顺序:
concat( '<Employees>', '<Employee>', '<Company>', '<Code>', variables('JsonObject')?['Employee'][0]?['Company'][0]?['Code'], '</Code>', '<Name>', variables('JsonObject')?['Employee'][0]?['Company'][0]?['Name'], '</Name>', '<ActiveUntil>', variables('JsonObject')?['Employee'][0]?['Company'][0]?['ActiveUntil'], '</ActiveUntil>', '<CompanyType>', '<Code>', variables('JsonObject')?['Employee'][0]?['Company'][0]?['CompanyType'][0]?['Code'], '</Code>', '</CompanyType>', '</Company>', '</Employee>', '<Employee>', '<EmailAddress>', variables('JsonObject')?['Employee'][1]?['EmailAddress'], '</EmailAddress>', '<GivenName>', variables('JsonObject')?['Employee'][1]?['GivenName'], '</GivenName>', '<MobilePhoneNumber>', variables('JsonObject')?['Employee'][1]?['MobilePhoneNumber'], '</MobilePhoneNumber>', '<EndDate>', variables('JsonObject')?['Employee'][1]?['EndDate'], '</EndDate>', '<Surname>', variables('JsonObject')?['Employee'][1]?['Surname'], '</Surname>', '<Updated>', variables('JsonObject')?['Employee'][1]?['Updated'], '</Updated>', '</Employee>', '</Employees>' )
这个方法的缺点是如果JSON有动态数组或者结构经常变化,维护成本会很高,但对于结构固定的场景,是最直接的解决方案。
为什么原方法无法保留顺序
你原来用的xml(json(concat('{"root":', string(variables('JsonObject')), '}')))逻辑里,json()函数解析JSON字符串后,Logic App底层会把JSON对象的键按字母排序存储,后续xml()转换时自然就输出了排序后的元素,所以这个内置组合逻辑没办法保留原顺序,必须用上面两种方法绕过。
内容的提问来源于stack exchange,提问作者DrejarN
相关产品推荐
相关产品推荐

