导航到原始负载上 dataweave 中 diff 函数返回的路径
Navigate to path returned from diff function in dataweave on original payload
我正在使用 dataweave diff 函数比较两个 json 对象。 Diff 运行正常并且 returning 了已更改的项目,但它 returning 了除了差异之外的任何东西。它是 returning 已更改的项目的路径,但我没有找到导航到基于字符串的路径的好方法。我在示例中只显示了一个组,但可以有多个具有不同唯一名称的组。
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [],
"group2": [],
etc...
)
下面是我要描述的示例:
有效载荷 1
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [
{
"name": "item1",
"enabled": true
},
{
"name": "item2",
"enabled": true
},
{
"name": "item3",
"enabled": true
}
]
}
有效负载 2:
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [
{
"name": "item1",
"enabled": true
},
{
"name": "item2",
"enabled": true
},
{
"name": "item3",
"enabled": false
}
]
}
在这种情况下,有效载荷 1 和有效载荷 2 之间的差异将 return
{
"matches": false,
"diffs": [
{
"expected": "true",
"actual": "false",
"path": "(root).group1[2].enabled"
}
]
}
我需要返回到原始负载并导航到 (root).order[2] 以获取名称 key/value 对。最好的方法是什么?
所以在一天结束时我需要的有效载荷是:
[
{
name: "item3",
enabled: false,
level: 1
}
]
感谢您提供的任何帮助。我也在做一个有效负载级别的映射,这样我就知道在遍历结果时要更新哪条数据。因此,在这种情况下,基于主对象之外的数组这一事实,级别将为 1。
这是我当前的数据编织我只需要第一个元素是动态的基于 diff returns
的路径
%dw 2.0
output application/json
---
payload.diffs map (item, index) -> {
name: initialPayload.group1[2].name, <-needs to be dynamic based on path
value: (item.actual) replace "\"" with "",
level: sizeOf(item.path splitBy ".")-1
}
我能够通过这种编织解决问题。
%dw 2.0
fun GetValue(group: String, level: Number, itemkey: String) =
GetKeyValue((((group) splitBy /\./ reduce (e, acc = vars.initialPayload) -> acc[e])[level]), itemkey)
fun GetKeyValue(obj: Object, itemKey: String) =
(entriesOf(obj) filter (item) -> item.key as String == itemKey).value[0]
output application/json skipNullOn="everywhere"
---
{
changes: payload.diffs map (item, index) -> {
name:
if (sizeOf(item.path splitBy ".") - 1 == 1)
((item.path splitBy ".")[1])
else
GetValue((((item.path splitBy ".")[1]) splitBy "[")[0], (((item.path splitBy ".")[1]) splitBy "[")[1] replace "]" with "", "name"),
value: item.actual replace "\"" with "",
level: (sizeOf(item.path splitBy ".") - 1),
}
}
我正在使用 dataweave diff 函数比较两个 json 对象。 Diff 运行正常并且 returning 了已更改的项目,但它 returning 了除了差异之外的任何东西。它是 returning 已更改的项目的路径,但我没有找到导航到基于字符串的路径的好方法。我在示例中只显示了一个组,但可以有多个具有不同唯一名称的组。
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [],
"group2": [],
etc...
)
下面是我要描述的示例:
有效载荷 1
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [
{
"name": "item1",
"enabled": true
},
{
"name": "item2",
"enabled": true
},
{
"name": "item3",
"enabled": true
}
]
}
有效负载 2:
{
"email": "someone@somewhere.com",
"frequency": 1,
"group1": [
{
"name": "item1",
"enabled": true
},
{
"name": "item2",
"enabled": true
},
{
"name": "item3",
"enabled": false
}
]
}
在这种情况下,有效载荷 1 和有效载荷 2 之间的差异将 return
{
"matches": false,
"diffs": [
{
"expected": "true",
"actual": "false",
"path": "(root).group1[2].enabled"
}
]
}
我需要返回到原始负载并导航到 (root).order[2] 以获取名称 key/value 对。最好的方法是什么?
所以在一天结束时我需要的有效载荷是:
[
{
name: "item3",
enabled: false,
level: 1
}
]
感谢您提供的任何帮助。我也在做一个有效负载级别的映射,这样我就知道在遍历结果时要更新哪条数据。因此,在这种情况下,基于主对象之外的数组这一事实,级别将为 1。
这是我当前的数据编织我只需要第一个元素是动态的基于 diff returns
的路径%dw 2.0
output application/json
---
payload.diffs map (item, index) -> {
name: initialPayload.group1[2].name, <-needs to be dynamic based on path
value: (item.actual) replace "\"" with "",
level: sizeOf(item.path splitBy ".")-1
}
我能够通过这种编织解决问题。
%dw 2.0
fun GetValue(group: String, level: Number, itemkey: String) =
GetKeyValue((((group) splitBy /\./ reduce (e, acc = vars.initialPayload) -> acc[e])[level]), itemkey)
fun GetKeyValue(obj: Object, itemKey: String) =
(entriesOf(obj) filter (item) -> item.key as String == itemKey).value[0]
output application/json skipNullOn="everywhere"
---
{
changes: payload.diffs map (item, index) -> {
name:
if (sizeOf(item.path splitBy ".") - 1 == 1)
((item.path splitBy ".")[1])
else
GetValue((((item.path splitBy ".")[1]) splitBy "[")[0], (((item.path splitBy ".")[1]) splitBy "[")[1] replace "]" with "", "name"),
value: item.actual replace "\"" with "",
level: (sizeOf(item.path splitBy ".") - 1),
}
}