【问题标题】:How to replace specific value in Json based on condition in Mule(3) Dataweave 1.0如何根据 Mule(3) Dataweave 1.0 中的条件替换 Json 中的特定值
【发布时间】:2021-05-02 22:21:43
【问题描述】:

我有一个像下面这样的 Json 输入,如果 doa 为 null 或 "" 它需要替换为值 test 如果它包含 Value 则不需要更改。我已经使用update 在 dwl 2 版本中实现了。在 dataweave 1.0 版本中使用 mabObject,但没有成功。寻找您的专业知识。谢谢

输入:

 {
    "sets": {
        "exd": {
            "cse": {
                "doa": null
            }
        }
    }
}

在 dwl 2 中实现:

%dw 2.0
output application/json skipNullOn="everywhere"
import * from dw::util::Values
---
 if 
 (!isEmpty (payload.sets.exd.cse.doa )) payload
 else
 payload  update
  {
    case .sets.exd.cse.doa! -> "test"
}
 

回应

     {
     "sets": {
        "exd": {
            "cse": {
                "doa": "test"
            }
        }
    }
}

在寻找Mule 3 dataweave 1.0 版本吗??

【问题讨论】:

    标签: mule mule-studio dataweave mule4


    【解决方案1】:

    这是从 DataWeave 2.0 到 DataWeave 1.0 的更新运算符的较小反向移植作为函数。 keys 参数是作为字符串的数组的键序列。我在 DataWeave 1.0 中添加了对键 null 或空的检查。

    %dw 1.0
    %output application/json
    %function updateKey(o,keys,value)
        o match {
            :object -> o mapObject ($$): 
                        updateKey($, keys[1 to -1], value )
                            when ($$ ~= keys[0] and ((sizeOf keys) >1))
                            otherwise ($ 
                                when ((sizeOf keys) >1) otherwise value
                            ),
                                            
            default -> $ 
        }
    ---
    updateKey(payload, ["sets", "exd", "cse", "doa"], "test") when (payload.sets.exd.cse.doa is :null or payload.sets.exd.cse.doa == "") otherwise payload
    

    【讨论】:

    • 这是一个有趣的解决方案,但不幸的是,如果您有多个键,它会产生更新基础对象中每个值的副作用。例如:{ "sets": { "exd": { "cse": { "doa": null, "some other key": "some other value" } } } } 输出:{ "sets": { "exd" : { "cse": { "doa": "test", "some other key": "test" } } } } 我还没有弄清楚如何将更新限制为目标键。
    【解决方案2】:

    If / else 语句在 dataweave 1.0 中的工作方式大不相同,update 不存在,我不知道 isEmpty 是否作为核心的一部分存在 - 不要这么认为。如果您提前知道对象的结构,您可以像这样简单地构建一个新对象:

    %dw 1.0
    %input payload application/json
    %output application/json
    ---
    payload when (payload.sets.exd.cse.doa != '' and payload.sets.exd.cse.doa != null) 
    otherwise {
      sets: {
        exd: {
          cse: {
            data: "test"
          }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      根据我对@aled 解决方案的评论,这里有一个更新,即使目标级别有多个键值对,也会限制对特定键的更改:

      %dw 1.0
      %output application/json
      
      %function updateKey(o,keys,value)
          o match {
              :object -> o mapObject ($$): 
                          updateKey($, keys[1 to -1], value )
                              when ($$ ~= keys[0] and ((sizeOf keys) >1))
                              otherwise ($ when (((sizeOf keys) >1) or '$$' != keys[0]) 
                                  otherwise value
                              ),                                        
              default -> $ 
          }
      ---
      updateKey(payload, ["sets", "exd", "cse", "doa"], "test") when (payload.sets.exd.cse.doa is :null or payload.sets.exd.cse.doa == "") otherwise payload
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多