问题描述
我需要通过动态访问/提取字段进行转换
{
"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”