导航到原始负载上 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),

  }
}