DataWeave 2.0 中的动态对象更新和创建

问题描述 投票:0回答:1

大家好,我正在尝试根据 data weave 2.0 中的数组更新和创建字段

例如这是我的输入

{
  "Body":{
      "Field1": "a",
      "Field2": "b",
      "Field3": "c",
      "Field4": {
          "SubField1": "d",
          "SubField2": {
              "SubSubField4":{
                  "Key": "Value"
              }
          }
      }
  }
}

我有这个字段数组要创建/更新

var propUp = [
  {
      "code":"Field4.SubField1",
      "value":"UPDATED1"
  },
  {
      "code":"Field4.TEST",
      "value":"UPDATED2"
  },
  {
      "code":"TEST",
      "value":"UPDATED3"
  },
  {
      "code":"Field4.SubField2.SubSubField4.Key",
      "value":"UPDATED4"
  }
]

我期待这样的物体

{
  "Body":{
      "Field1": "a",
      "Field2": "b",
      "Field3": "c",
      "Field4": {
          "SubField1": "UPDATED1",
          "SubField2": {
              "SubSubField4":{
                  "Key": "UPDATED4"
              }
          },
          "TEST": "UPDATED2"
      },
      "TEST": "UPDATED3"
  }
}
mule dataweave mulesoft mule4
1个回答
0
投票

我重用了这个答案中的方法:https://stackoverflow.com/a/68747962/721855来获取字符串中路径的值。

%dw 2.0
output application/json
import * from dw::core::Arrays

fun getField(payload: Any, field: String) = do {
    var path = field splitBy '.' reduce((pathPart, path=[]) ->
        if (pathPart contains '[') do {
            var pieces = pathPart splitBy '['
            ---
            pieces reduce((piece,subPath=path) -> 
                if (piece contains ']') subPath << (piece replace ']' with '') as Number
                else subPath << piece
            )
        }
        else path << pathPart
    )
    ---
    getField(payload, path)
}

fun getField(payload: Any, field: Array) =
    if (sizeOf(log('field',field)) == 1) payload[field[0]]
    else getField(payload[field[0]], field[1 to -1])

var propUp = [
  {
      "code":"Field4.SubField1",
      "value":"UPDATED1"
  },
  {
      "code":"Field4.TEST",
      "value":"UPDATED2"
  },
  {
      "code":"TEST",
      "value":"UPDATED3"
  },
  {
      "code":"Field4.SubField2.SubSubField4.Key",
      "value":"UPDATED4"
  }
]

fun isPathInpropUp(path: String)=
    propUp firstWith ($.code == path)

fun updateValues(x, path)=x match {
    case o is Object -> o mapObject ((value, key) -> (key): updateValues(value, path ++ (if (!isEmpty(path)) "." else "") ++ key as String))
    case a is Array -> a map updateValues($, path)
    else -> if ( isPathInpropUp(path) is Null ) x else isPathInpropUp(path).value 
  }

---
{
    Body: updateValues(payload.Body, "")
}

输出:

{
  "Body": {
    "Field1": "a",
    "Field2": "b",
    "Field3": "c",
    "Field4": {
      "SubField1": "UPDATED1",
      "SubField2": {
        "SubSubField4": {
          "Key": "UPDATED4"
        }
      },
      "TEST": "UPDATED2"
    },
    "TEST": "UPDATED3"
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.