Jolt: modify-default-beta: 第一个参数是做什么的?

Jolt: modify-default-beta: what does the first argument do?

我发现这个 关于用另一个字段的值替换一个不存在的字段。它解释了 modify-default-beta 操作的用法。 post中提到的例子:

规格

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "shipping_address": {
        "address": "@(2,payment_address.address)"
      }
    }
  }
]

输入A,没有送货地址

{
  "payment_address": {
    "address": "some address"
  },
  "shipping_address": {}
}

生成输出 A,其中复制了帐单地址

{
  "payment_address" : {
    "address" : "some address"
  },
  "shipping_address" : {
    "address" : "some address"
  }
}

@(2,payment_address.address)中的“2”是什么意思。我试过这个例子here,即使我用“3”替换“2”它也能正常工作。

Jolt 操作对输入 JSON 和 Spec 进行并行树遍历。它从 Spec & input JSON 的根开始,然后进行深度优先遍历。

在进行深度优先遍历时,它会维护 "stack" 它匹配的数据/节点。

因此在本规范中,当您 "match" 下降到 "address"

"operation": "modify-default-beta",
"spec": {
  "shipping_address": {
    "address": "@(2,payment_address.address)"
  }
}

堆栈看起来像:

Stack "pointer"  Matched value       Pointer to Input
0                "address"           Value of Address : String if it exists
1                "shipping_address"  Value of "shipping_address" : Map if it exists
2                "_root_"            A made up entry to point to Input Json (Map or List)
3                "_root_"            Another "root" that points to a Map  
                                       WorkAround to deal with top level List JSON input

所以“2”让你回到输入 Json 的 "top level",这样你就可以 "navigate" 向下 "payment_address.address"。

"3" 之所以有效,是因为您现在处于包装器中,因此所有 "top level" 输入到 Transforms 的都是一个 Map,以解决顶级列表 /"[]" 如果有效 JSON。这个包装器是特殊的,与“2”具有相同的引用。

堆栈中不存在“4”,因此它不执行任何操作。