【问题标题】:Jolt: modify-default-beta: what does the first argument do?Jolt: modify-default-beta: 第一个参数是做什么的?
【发布时间】:2017-11-02 07:58:04
【问题描述】:

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

规格

[
  {
    "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,即使我将“2”替换为“3”,它也能正常工作。

【问题讨论】:

    标签: json jolt


    【解决方案1】:

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

    当它进行深度优先遍历时,它会维护它匹配的数据/节点的“堆栈”。

    因此在本规范中,当您“匹配”到“地址”时

    "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 的“顶层”,这样你就可以“导航”到“payment_address.address”。

    “3”之所以有效,是因为您现在处于包装器中,因此转换的所有“顶级”输入都是一个映射,以解决顶级列表/“[]”(如果有效 JSON)这一事实。这个包装器的特殊情况是与“2”具有相同的引用。

    堆栈中不存在“4”,所以它什么也不做。

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 2023-01-25
      • 2019-05-10
      • 2015-01-05
      • 1970-01-01
      • 2012-05-04
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多