0

0

JOLT Shift转换:如何从任意嵌套层级收集数据并强制输出为数组

花韻仙語

花韻仙語

发布时间:2025-07-21 15:16:11

|

822人浏览过

|

来源于php中文网

原创

JOLT Shift转换:如何从任意嵌套层级收集数据并强制输出为数组

本文深入探讨了JOLT shift 转换中一个常见挑战:如何从深度不定的嵌套JSON结构中提取特定字段的值,并将其统一收集到一个列表中,即使只有一个匹配项也强制生成数组。核心解决方案是利用JOLT shift 规范中目标路径后的 [] 语法,确保无论输入数据量多少,输出结果始终是期望的数组格式,从而实现数据扁平化与标准化。

引言

jolt(json to json transformation language)是一个强大的json数据转换工具,尤其适用于对复杂json结构进行重塑、过滤和聚合。在数据处理场景中,我们经常会遇到需要从多层嵌套的数据中提取特定信息,并将其扁平化为一个列表的需求。然而,当匹配到的元素只有一个时,jolt的默认行为可能不会生成数组,这给下游系统处理带来了不便。本文将详细介绍如何利用jolt shift 操作的特性,优雅地解决这一问题,确保输出始终为数组。

问题剖析:多层嵌套与数组输出的挑战

假设我们有一个JSON结构,其中包含多层嵌套的item数组,并且我们希望从最内层的foo对象中提取nn字段的值,最终将所有这些值汇集到一个名为type的数组中。关键挑战在于:

  1. 未知嵌套深度:虽然示例中展示了固定的嵌套层级,但在实际应用中,item数组的嵌套深度可能不确定。
  2. 强制数组输出:无论匹配到的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 shift 操作的一个简洁而强大的特性:在目标路径(右侧值)后添加[]。这会指示JOLT,无论有多少个值被映射到该路径,都应该将它们收集到一个数组中。

腾讯AI 开放平台
腾讯AI 开放平台

腾讯AI开放平台

下载

核心思想:

将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", ... ]
}

注意事项与最佳实践

  1. [] 的应用场景:[] 后缀是JOLT shift 操作中用于强制生成数组的通用模式。当你不确定输入数据会产生一个还是多个值,但希望输出始终是数组时,应始终使用此模式。
  2. 处理多层嵌套的策略
    • 硬编码路径:如本例所示,通过重复的路径匹配(item.*.item.*)可以处理已知最大深度的嵌套。这种方法在深度固定或有上限时有效。
    • 递归转换:对于真正任意深度的嵌套,JOLT shift 本身可能无法一步到位。可能需要结合其他JOLT操作(如flatten或cardinality)或者进行多次JOLT转换,甚至在JOLT外部进行预处理或后处理。本例中,通过重复item.*来“捕获”不同深度的foo对象是一种常见的折衷方案。
  3. *通配符 `的使用**:在shift操作中,*` 作为通配符用于匹配数组索引或对象键,这使得Spec能够适应结构中的动态部分。
  4. JOLT的聚合行为:当多个输入路径映射到同一个输出路径(例如,多个nn都映射到type[])时,JOLT会自动将这些值聚合到同一个数组中。这是shift操作的强大之处。

总结

在JOLT shift 转换中,确保输出字段始终为数组是一个常见的需求。通过在目标路径后简单地添加 [],我们可以强制JOLT将所有匹配到的值收集到一个数组中,无论匹配项的数量是一个还是多个。这一技巧极大地提高了JOLT转换的鲁棒性和输出的标准化程度,是处理复杂JSON数据结构时不可或缺的技能。掌握这一方法,将使你的JOLT转换规范更加灵活和强大。

相关专题

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

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

410

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

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号