大家好,我正在尝试根据 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"
}
}
我重用了这个答案中的方法: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"
}
}