对于 jolt 处理器,当您尝试添加已经存在的键映射时,应用程序会为此大喊大叫。但是,在您的情况下,您似乎正在处理两种不同类型的内存存储,其中 1 是一个数组,另一个是一个变量。由于某种原因,处理器似乎优先于数组而不是单个值,但不要担心,这有很多工作。
- 第一个也是最明显的解决方案是在
abc 的数组索引中传递"@":"&"。
According to the documentation of wildcards in the shift operations of jolt processors,
-
@ 在 : 的左侧表示将传递的键作为索引。
-
& 位于 : 的右侧,代表与此传递的索引关联的值(如果您愿意,可以取消引用)。
这将拉取与传递的密钥相关的所有信息。 但是,这将包括所有数组值的重复,在大多数情况下,这与您首先重新映射其索引的理由背道而驰。
- 第二种解决方案,也许是最理想的解决方案是重新映射变量。 According to the wildcard documentation,
# 允许引用信息。在: 的右侧,它用于根据在回溯其数组信息时找到的匹配数来提取索引。在我们的例子中,左侧的用处要多得多,它允许我们将实例值的映射硬编码到新字段
获取代码
"foo" :{
"bar" : {
"#lemonade" : "drinks"
}}
当 bar 实例作为有形 值 被发现到字段“foo”时,您就会将一个名为“lemonade”的值映射到一个名为“drinks”的字段。这将允许您处理 abc 的输出与标准数组不同的实例。 但是,这是一种硬编码,因此无法转换为您最初寻求的布尔值。
- 第三个也是最理想的解决方案是规避此问题的一种相当偷偷摸摸的方法,即使用要转换到的字段创建一个单独的索引。 For reference and clarification to this technique, see here.
获取以下代码:
[
{
"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 映射。
这种方法虽然不是最优雅的,但它不仅避免了最初的问题,而且它保留了数据类型,并且可能可以扩展以处理各种其他值,例如整数甚至双精度数,但是此类努力需要进一步的测试和研究。