0

0

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

DDD

DDD

发布时间:2025-07-21 15:46:10

|

788人浏览过

|

来源于php中文网

原创

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

Elser AI Comics
Elser AI Comics

一个免费且强大的AI漫画生成工具,助力你三步创作自己的一出好戏

下载

修正后的 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 转换需求。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

411

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

532

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

309

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

617

2023.11.24

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.5万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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