-1

我正在尝试创建一个将接受输入的规范

abc:true
abc: {strings ...}

和输出:

abc:true
abc: {strings ...}

我知道这不应该需要一个 Jolt shift,我只需要包含它,以便我的数据段(两个abc键)传输并且不会丢失,

有谁知道要在 Jolt shift 规范中添加什么来做到这一点(根据它们的值类型转移 2 个重复键)。

4

1 回答 1

1

对于 jolt 处理器,当您尝试添加已经存在的键映射时,应用程序会为此大喊大叫。但是,在您的情况下,您似乎正在处理两种不同类型的内存存储,其中 1 是一个数组,另一个是一个变量。由于某种原因,处理器似乎优先于数组而不是单个值,但不要担心,对此有很多工作要做。

  1. 第一个也是最明显的解决方案是"@":"&"abc. 根据 jolt 处理器移位操作中通配符的文档
  • @位于代表的左侧,:用于将传递的键作为索引。
  • &位于的右侧:代表与此传递的索引关联的值(如果您愿意,可以取消引用)。

这将一起提取与传递的密钥相关的所有信息。但是,这将包括所有数组值的重复,这在大多数情况下与您首先重新映射其索引的推理背道而驰。

  1. 第二个解决方案,也许是最理想的解决方案是重新映射变量。根据通配符文档#允许引用信息。在 a 的右侧:,它用于根据在回溯其数组信息时找到的匹配数来提取索引。在我们的例子中,左侧有更多用途,它允许我们将实例值的映射硬编码到新字段

拿代码

"foo" :{
          "bar" : {
               "#lemonade" : "drinks"
}}

当 bar 的实例被视为字段“foo”的有形时,您将把一个名为“lemonade”的值映射到一个名为“drinks”的字段。这将允许您处理与abc标准数组不同的输出实例。但是,这是一种硬编码,因此不能转换为您最初寻求的布尔值。

  1. 第三种也是最理想的解决方案是规避此问题的一种相当偷偷摸摸的方法,即使用要转换到的字段创建一个单独的索引。有关此技术的参考和说明,请参见此处。 采取以下代码:
[
 {
    "operation" : "default",
    "spec":{
            "ref":{
                "True" : true,
                "False": false
                }
    }
 },
 {
    "operation" : "shift",
    "spec":{
            "abc":{
                "true":{
                        "@(3,ref.true)":"abc"
                        },
                "false":{
                        "@(3,ref.false)":"abc"
                        }
                }
            }
 },
 {
    "operation" : "remove",
    "spec":{
        "ref" : ""
        }
 }
]

我们在这里所做的是在 jolt 处理器的启动处,我们正在创建一个称为 ref 的参考索引,我们将布尔值 true 和 false 传递给它以供以后使用。我们继续进行移位操作,然后我们继续执行示例 2 中所做的操作,开始指示当此特定值出现在父标头中时我们会做什么,但是我们使用附加函数@来追溯树 3 个父母,并使用字段的参考值True并将False必要的布尔值附加到字段abc。它通过删除该字段来整理所有内容,ref因此您剩下的就是正确的abc.

这种方法,如果不是最优雅的,不仅避免了最初的问题,而且它保留了数据类型,并且可能可以扩展以处理各种其他值,如整数甚至双精度值,但是需要进一步的测试和研究来实现这些努力.

于 2017-05-23T23:32:22.837 回答