首页 > Java > java教程 > 正文

JOLT Shift 转换技巧:确保多层级数据扁平化为统一数组

DDD
发布: 2025-07-21 15:46:10
原创
778人浏览过

JOLT Shift 转换技巧:确保多层级数据扁平化为统一数组

本文深入探讨 JOLT Shift 转换中一个常见挑战:如何将 JSON 数据中不同层级的特定字段收集并扁平化到一个统一的数组中,即使原始数据仅包含单个元素。核心解决方案在于利用 JOLT Shift 规则中目标键后的 [] 语法,确保无论输入数据量大小,输出始终为数组类型,从而实现数据格式的标准化和一致性。

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 数组中。即使只有一个值,也会被包装在单元素数组中。

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人

修正后的 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 Spec 通过重复 item 和 foo 的路径来匹配不同深度的 nn 字段。这种方法适用于已知可能出现 nn 的特定嵌套路径。对于完全未知或任意深度的递归结构,JOLT 本身没有直接的递归下降操作符,通常需要更复杂的 Spec 设计,或者在 JOLT 之前进行预处理,或者通过多次 JOLT 转换实现。然而,对于本例中这种“有限但多层”的结构,当前 Spec 配合 [] 已经非常有效。
  • 性能考量: 复杂的 JOLT Spec 可能会影响转换性能,尤其是在处理大型 JSON 数据时。在实际应用中,应权衡 Spec 的复杂性和数据的规模。

总结

通过在 JOLT Shift 转换的目标键后添加 [],我们可以有效地解决 JSON 转换中单元素输出非数组的问题,确保无论输入数据量如何,输出始终保持为统一的数组格式。这一技巧对于需要标准化数据结构、方便后续处理的场景至关重要,极大地增强了 JOLT 转换的灵活性和鲁棒性。掌握此技巧,将有助于更高效地利用 JOLT 处理各类复杂的 JSON 转换需求。

以上就是JOLT Shift 转换技巧:确保多层级数据扁平化为统一数组的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号