通过有效负载对象 v1 进行迭代?

Iterate via payload object v1?

正在努力做我想做的事,也许你可以帮助我。 我有一个包含不同数量项目的动态输出对象,我不知道键的名称,所以我只是像这样输出:

%dw 1.0
%Output application/json skipNullOn = "everywhere"
---
flowVars.OutputListArr orderBy $$

这适用于以下负载:

ccc="333", bbb="222", aaa="111", ddd="444"

但现在我有这样的情况,其中一个键是一个列表,但我想 return 它作为数组,例如

bbb = "221,222,223"

我可以做到

splitBy "," ->> "['221', '222', '223']"

但不知道如何一起做。 那么输入将是这样的:

{ccc="333",bbb="221,222,223",aaa="111", ddd="441, 442, 443"}

我想把它改造成:

"aaa": "111",
"bbb": ["221","222","223"],
"ccc": "333"
"ddd": "441, 442, 443",

所以只有 bbb 字符串被拆分(我知道 bbb 密钥名称)

upd:只是得到一种情况,然后 bbb 可能只有一个成员,所以期待一种方法来检查关键属性名称,然后使其成为数组...所以不属于它自己的内容

您可以使用递归函数来检查值的类型并对每个值应用正确的方法。此外,它会在对象上递归,以防存在嵌套对象。

示例:

%dw 1.0
%output application/json

%function filterKeys(o, k)
    o mapObject
            { 
                ($$): 
                    $ when ($ is :string and (k contains ($$ as :string)))
                    otherwise orderMembers($, k)
            } 
            orderBy $$

%function splitString(s) s splitBy "," map trim $

%function orderMembers(x, k)
    x match {
        a is :array -> a orderBy $,
        o is :object -> filterKeys(o, k),
        s is :string -> orderMembers(splitString(s), k)
             when s  contains ',' otherwise s,
        default -> $
    }
    
%var testData={ccc:"333", ddd: ["555", "333", "222"], bbb: "223,221,222", eee: "456, 789, 123", aaa: 11}
---
orderMembers(testData, ["bbb"]) 

输出:

{
  "aaa": 11,
  "bbb": "223,221,222",
  "ccc": "333",
  "ddd": [
    "222",
    "333",
    "555"
  ],
  "eee": [
    "123",
    "456",
    "789"
  ]
}

更新:添加了我们要保留的键的键列表,其他包含逗号的键将被拆分。请注意,我修剪了拆分的元素以避免多余的空间。如果不需要,您可以删除它。