
jolt(json to json transformation language)是一个强大的json数据转换工具,尤其适用于对复杂json结构进行重塑、过滤和聚合。在数据处理场景中,我们经常会遇到需要从多层嵌套的数据中提取特定信息,并将其扁平化为一个列表的需求。然而,当匹配到的元素只有一个时,jolt的默认行为可能不会生成数组,这给下游系统处理带来了不便。本文将详细介绍如何利用jolt shift 操作的特性,优雅地解决这一问题,确保输出始终为数组。
假设我们有一个JSON结构,其中包含多层嵌套的item数组,并且我们希望从最内层的foo对象中提取nn字段的值,最终将所有这些值汇集到一个名为type的数组中。关键挑战在于:
输入示例:
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": {
"id": 1232,
"nn": "sdfsd"
}
}
]
}期望输出:
{
"type": [ "sdfsd" ]
}用户尝试的JOLT Spec及其遇到的问题:
用户尝试编写了一个JOLT shift 规范来解决此问题:
[
{
"operation": "shift",
"spec": {
"item": {
"*": {
"item": {
"*": {
"item": {
"*": {
"foo": {
"nn": "type"
}
}
},
"foo": {
"nn": "type"
}
}
},
"foo": {
"nn": "type"
}
}
}
}
}
]然而,当输入中只有一个匹配的nn值时,上述Spec产生的输出是:
{
"type": "sdfsd"
}type字段被转换为一个字符串,而非期望的数组。这表明JOLT在默认情况下,如果只有一个值映射到目标路径,它会直接将该值赋给目标字段,而不是将其包裹在数组中。
解决上述问题的关键在于JOLT shift 操作的一个简洁而强大的特性:在目标路径(右侧值)后添加[]。这会指示JOLT,无论有多少个值被映射到该路径,都应该将它们收集到一个数组中。
核心思想:
将JOLT Spec中所有将nn值映射到type的地方,将其右侧的type改为type[]。
修正后的JOLT Spec:
[
{
"operation": "shift",
"spec": {
"item": {
"*": {
"item": {
"*": {
"item": {
"*": {
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
}
}
}
]修正后的输出:
使用上述修正后的JOLT Spec对原输入进行转换,将得到期望的输出:
{
"type": [ "sdfsd" ]
}即使只有一个sdfsd值,它也被正确地包裹在了一个数组中。如果输入包含多个item层级或多个item元素,所有匹配的nn值都将被收集到同一个type数组中,例如:
{
"type": [ "sdfsd", "dfsds", "fjghi", ... ]
}在JOLT shift 转换中,确保输出字段始终为数组是一个常见的需求。通过在目标路径后简单地添加 [],我们可以强制JOLT将所有匹配到的值收集到一个数组中,无论匹配项的数量是一个还是多个。这一技巧极大地提高了JOLT转换的鲁棒性和输出的标准化程度,是处理复杂JSON数据结构时不可或缺的技能。掌握这一方法,将使你的JOLT转换规范更加灵活和强大。
以上就是JOLT Shift转换:如何从任意嵌套层级收集数据并强制输出为数组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号