使用 DataWeave 动态访问嵌套的 json 属性

问题描述

我需要通过动态访问/提取字段进行转换

{
    "simple" : "ab","nestone": [
    {    
     "value": "zzz"
    }
  ],"nesttwo": [
    {
    "val": {
        "nesttwoval": [
        {
            "value": "zzz"
        }
        ]
    }
    }
]

}

我需要如下输出。 s1 和 n1 可以使用 .符号 “s1”:payload.simple, “n1”:payload.nestone.value, 但我无法提取第三个巢穴。任何见解都会有所帮助


{
  "s1": "ab","n1": [
    "zzz"
  ],"n2": null
}

解决方法

像这样

%dw 2.0
output application/json
---
{
    s1: payload.simple,n1:payload.nestone.value,n2: payload..nesttwoval..value
}
,

你可以试试这个:

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


fun returnValue(item) = 
    item match { 
        case is Array -> (($ map { a: $..value }).a)[0]
        case is Object -> (($ mapObject { a: $..value }).a)[0]
        else -> $
        }
---
payload mapObject {
    "s$$$": returnValue($)

/*payload mapObject {
    (($$ [0])++ ($$$+1)): returnValue($)

}/* dynamic key in the output

}
,

根据您发表的另一条评论,我认为您要求的内容并未内置于语言中,尽管库中有一些与 update 函数相关的有趣函数。您想要的基本实现可能如下所示:

%dw 2.0
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(field) == 1) payload[field[0]]
    else getField(payload[field[0]],field[1 to -1])

使用此输入进行调用:

{
   "names": [
     {
        "firstName": "Bob","lastName": "Smith"
     },{
         "firstName": "John","lastName": "Doe"
     }
   ]
}

getField(payload,"names[0].firstName")

会返回“BoB”