Mule 4 DataWeave 2如何递归排序多层嵌套JSON对象
使用DataWeave递归排序多层嵌套JSON对象的所有键
问题描述
需要对包含任意层级嵌套对象的非数组JSON对象,递归排序所有层级的键。输入示例如下:
{ "Memo": { "itemAmount1": "5", "taxName1": "TAX", "productPrice1": "10", "accountName1": "Account Receivable (Debtors)" }, "Footer": { "productDescription2": "Maggie", "itemQuantity2": "49.5", "accountName2": "Account Receivable (Debtors)", "taxName2": "TAX" }, "Header": { "itemDiscount3": "10", "accountName3": "Account Receivable (Debtors)", "productPrice3": "10", "taxName3": "TAX" } }
预期输出需同时排序所有嵌套层级的键:
{ "Footer": { "accountName2": "Account Receivable (Debtors)", "itemQuantity2": "49.5", "productDescription2": "Maggie", "taxName2": "TAX" }, "Header": { "accountName3": "Account Receivable (Debtors)", "itemDiscount3": "10", "productPrice3": "10", "taxName3": "TAX" }, "Memo": { "accountName1": "Account Receivable (Debtors)", "itemAmount1": "5", "productPrice1": "10", "taxName1": "TAX" } }
解决方案
以下是实现递归排序的DataWeave 2.0代码:
%dw 2.0 output application/json fun sortObjectKeys(obj: Object): Object = obj pluck ((value, key) -> { (key): if (value is Object) sortObjectKeys(value) else value }) orderBy ((item) -> keysOf(item)[0]) --- sortObjectKeys(payload)
代码解释
- 递归函数定义:
sortObjectKeys函数接收一个Object类型参数,专门处理单个对象的键排序逻辑。 - 遍历与嵌套处理:用
pluck遍历输入对象的所有键值对,对每个值做判断:如果值是Object类型,就递归调用sortObjectKeys处理嵌套对象;非对象类型则直接保留原值。 - 按键排序:通过
orderBy操作,以每个键值对的键(keysOf(item)[0])为依据做字母顺序排序,确保所有层级的键都按规则排列。 - 执行处理:最后调用
sortObjectKeys(payload)对输入的JSON payload执行完整的排序操作。
该实现支持任意深度的嵌套对象,无论层级多少,都会递归完成所有键的排序。
内容的提问来源于stack exchange,提问作者GettingStarted With123
相关产品推荐
相关产品推荐

