【问题标题】:Iterate via payload object v1?通过有效负载对象 v1 进行迭代?
【发布时间】:2021-04-18 22:13:46
【问题描述】:

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

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

这适用于有效载荷,例如:

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

但现在我遇到了这样的情况,其中一个键是一个列表,但我想将它作为数组返回,例如

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 键名)

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

【问题讨论】:

    标签: dataweave mulesoft mule-esb


    【解决方案1】:

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

    例子:

    %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"
      ]
    }
    

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

    【讨论】:

    • 我将 orderBy 移到了对象案例中,所以它是特定的,您不必记住这一点。字符串的标准是什么?我修改了字符串条件以避免在字符串中没有逗号时拆分,但我不确定您要使用什么作为条件。
    • 您可以添加第二个参数,其中包含要保留的已知键列表,并修改条件以检查该键是否包含在列表中并执行不同的操作。
    • 我有时间会尝试在示例中添加一些内容
    • 请使用新的输入数据打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2020-07-26
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多