
jolt 是一个强大的 json 转换工具,但在处理复杂或动态结构时,常遇到如何将分散在不同层级的数据统一收集到特定格式的问题。一个典型场景是,需要从可能嵌套多层的数据中提取特定字段,并将其汇聚成一个数组。然而,当符合条件的元素只有一个时,jolt 默认行为可能输出单个值而非数组,这与预期不符。
假设我们有如下输入 JSON,目标是提取所有 foo 内部 nn 字段的值,并将其放入一个名为 type 的数组中。
输入示例:
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": {
"id": 1232,
"nn": "sdfsd"
}
}
]
}期望输出:
{
"type" : [ "sdfsd" ]
}用户尝试的 JOLT Spec 如下,它旨在从 item 数组的不同嵌套层级中提取 foo.nn:
[
{
"operation": "shift",
"spec": {
"item": {
"*": {
"item": {
"*": {
"item": {
"*": {
"foo": {
"nn": "type"
}
}
},
"foo": {
"nn": "type"
}
}
},
"foo": {
"nn": "type"
}
}
}
}
}
]然而,对于上述单元素输入,该 Spec 的实际输出为:
{
"type" : "sdfsd"
}可以看到,type 字段被输出为一个字符串而不是数组。只有当输入包含多个匹配项时,JOLT 才会自动将其转换为数组。这导致了输出格式的不一致性,给后续处理带来不便。
JOLT Shift 转换提供了一种简洁的机制来强制目标字段始终输出为数组,无论源数据匹配项的数量。只需在 shift 规则的右侧,即目标键的名称后,添加 [] 即可。
原理阐述: 当 JOLT 在 shift 操作中遇到形如 outputKey[] 的目标路径时,它会指示无论有多少个值被映射到 outputKey,都将其收集到一个 JSON 数组中。即使只有一个值,也会被包装在单元素数组中。
修正后的 JOLT Spec:
我们将原 Spec 中所有 nn 映射到的目标键 type 修改为 type[]:
[
{
"operation": "shift",
"spec": {
"item": {
"*": {
"item": {
"*": {
"item": {
"*": {
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
},
"foo": {
"nn": "type[]"
}
}
}
}
}
]使用修正后的 Spec 转换单元素输入:
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": {
"id": 1232,
"nn": "sdfsd"
}
}
]
}{
"type" : [ "sdfsd" ]
}此时,即使只有一个匹配的 nn 值,type 也被正确地输出为包含该值的数组,符合预期。
使用修正后的 Spec 转换多元素输入 (验证通用性):
{
"id": 1,
"item": [
{
"id": "1_1",
"foo": { "id": 1232, "nn": "sdfsd" }
},
{
"id": "1_2",
"item": [
{
"id": "2_1",
"foo": { "id": 456, "nn": "dfsds" }
}
]
},
{
"id": "1_3",
"item": [
{
"id": "2_2",
"item": [
{
"id": "3_1",
"foo": { "id": 789, "nn": "fjghi" }
}
]
}
]
}
]
}{
"type" : [ "sdfsd", "dfsds", "fjghi" ]
}可以看到,对于包含多个匹配项的复杂输入,修正后的 Spec 依然能正确地将所有 nn 值收集到一个数组中,保持了输出格式的一致性。
通过在 JOLT Shift 转换的目标键后添加 [],我们可以有效地解决 JSON 转换中单元素输出非数组的问题,确保无论输入数据量如何,输出始终保持为统一的数组格式。这一技巧对于需要标准化数据结构、方便后续处理的场景至关重要,极大地增强了 JOLT 转换的灵活性和鲁棒性。掌握此技巧,将有助于更高效地利用 JOLT 处理各类复杂的 JSON 转换需求。
以上就是JOLT Shift 转换技巧:确保多层级数据扁平化为统一数组的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号