新闻中心

JOLT转换:将数组中多个独立对象合并为一个单一对象

2025-12-05
浏览次数:
返回列表

JOLT转换:将数组中多个独立对象合并为一个单一对象

本文详细介绍了在使用jolt进行json数据转换时,如何解决将输入数据中的多个字段分别转换为数组中独立对象的问题,并将其优化为单个包含所有字段的对象。核心解决方案是利用jolt shift 操作中的固定数组索引(如data[0]),确保所有目标字段都映射到数组的同一个元素中,同时提供了优化jolt规范的实践建议。

引言:JOLT数组转换中的常见挑战

在使用JOLT进行JSON数据转换时,一个常见的需求是将扁平化的输入JSON结构转换为包含特定字段的数组。然而,在实际操作中,如果不正确地配置JOLT shift 规范,可能会导致数组中每个字段都成为一个独立的子对象,而非所有字段合并成一个单一的复杂对象。这种“冗余的括号”结构通常不是我们所期望的。本教程将深入探讨这一问题,并提供一个高效且优雅的解决方案。

原始输入与问题描述

假设我们有一个扁平化的JSON对象作为输入,其中包含资产的各种属性:

原始输入JSON

{
  "AssetID": "1",
  "AssetNumber": "2",
  "AssetMaterial": "Cisco MDS 9706",
  "RackUnits": "9.0",
  "MaterialType": "Chassis",
  "AssetName": "Cisco-MDS-9706_1",
  "CustRID": "A001",
  "SerialNumber": "OU812",
  "Room": "ROOM5",
  "Datacenter": "DC69",
  "UMountingID": "86",
  "CabinetAssetID": "181",
  "CabinetName": "CAB666"
}

当前JOLT转换规范及输出

为了将这些资产信息转换为一个名为 data 的数组,其中每个字段都包含一个 value 键,我们可能最初会尝试以下JOLT shift 规范:

[
  {
    "operation": "shift",
    "spec": {
      "AssetID": "data[].6.value",
      "AssetNumber": "data[].7.value",
      "AssetMaterial": "data[].8.value",
      "AssetName": "data[].9.value",
      "CustRID": "data[].10.value",
      "SerialNumber": "data[].11.value",
      "Room": "data[].12.value",
      "Datacenter": "data[].13.value",
      "UMountingID": "data[].14.value",
      "CabinetAssetID": "data[].15.value",
      "CabinetName": "data[].16.value"
    }
  },
  {
    "operation": "default",
    "spec": {
      "to": "table1"
    }
  },
  {
    "operation": "default",
    "spec": {
      "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
    }
  }
]

使用上述规范进行转换后,会得到以下输出:

{
  "data": [
    {
      "6": {
        "value": "1"
      }
    },
    {
      "7": {
        "value": "2"
      }
    },
    {
      "8": {
        "value": "Cisco MDS 9706"
      }
    },
    {
      "9": {
        "value": "Cisco-MDS-9706_1"
      }
    },
    {
      "10": {
        "value": "A001"
      }
    },
    {
      "11": {
        "value": "OU812"
      }
    },
    {
      "12": {
        "value": "ROOM5"
      }
    },
    {
      "13": {
        "value": "DC69"
      }
    },
    {
      "14": {
        "value": "86"
      }
    },
    {
      "15": {
        "value": "181"
      }
    },
    {
      "16": {
        "value": "CAB666"
      }
    }
  ],
  "to": "table1",
  "fieldsToReturn": [ 6, 7, 8, 9, 10, 11, 12 ]
}

可以看到,data 数组中包含了多个独立的JSON对象,每个对象只包含一个键值对。这并不是我们想要的。

期望输出结构

我们期望的输出是 data 数组中只有一个对象,该对象包含了所有转换后的键值对:

{
  "data" : [
    {
        "6" : {
          "value" : "1"
        }, 
        "7" : {
          "value" : "2"
        }, 
        "8" : {
          "value" : "Cisco MDS 9706"
        }, 
        "9" : {
          "value" : "Cisco-MDS-9706_1"
        }, 
        "10" : {
          "value" : "A001"
        }, 
        "11" : {
          "value" : "OU812"
        }, 
        "12" : {
          "value" : "ROOM5"
        }, 
        "13" : {
          "value" : "DC69"
        }, 
        "14" : {
          "value" : "86"
        }, 
        "15" : {
          "value" : "181"
        }, 
        "16" : {
          "value" : "CAB666"
        }
    }
   ],
  "to" : "table1",
  "fieldsToReturn" : [ 6, 7, 8, 9, 10, 11, 12 ]
}

解决方案核心:固定数组索引的应用

问题的关键在于JOLT shift 操作中数组索引的使用。

理解shift操作中的数组索引

  • 当在 shift 规范中使用 [] 时(例如 data[]),JOLT 会为每个匹配的输入创建一个新的数组元素。因此,在上面的例子中,每个 AssetID、AssetNumber 等都会在 data 数组中生成一个全新的对象。
  • 为了将所有字段合并到数组中的 同一个 对象里,我们需要指定一个 固定 的数组索引。最常见且直接的方法是使用 [0],即 data[0]。这将确保所有匹配的转换都指向 data 数组的第一个元素。

修正后的JOLT转换规范

基于上述理解,我们可以修改 shift 规范,将所有输出路径的目标数组索引固定为 0。同时,为了优化JOLT规范,可以将第一个 default 操作(用于设置 "to": "table1")直接合并到 shift 规范中,通过使用 # 符号来指定常量值。

PHP经典实例(第二版) PHP经典实例(第二版)

PHP经典实例(第2版)能够为您节省宝贵的Web开发时间。有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。《PHP经典实例(第2版)》将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到各种编程问题的解决方案,《PHP经典实例(第2版)》中内容涵盖了:表单处理;Session管理;数据库交互;使用We

PHP经典实例(第二版) 470 查看详情 PHP经典实例(第二版)
[
  {
    "operation": "shift",
    "spec": {
      "AssetID": "data[0].6.value",
      "AssetNumber": "data[0].7.value",
      "AssetMaterial": "data[0].8.value",
      "AssetName": "data[0].9.value",
      "CustRID": "data[0].10.value",
      "SerialNumber": "data[0].11.value",
      "Room": "data[0].12.value",
      "Datacenter": "data[0].13.value",
      "UMountingID": "data[0].14.value",
      "CabinetAssetID": "data[0].15.value",
      "CabinetName": "data[0].16.value",
      "#table1": "to"  // 将 "to": "table1" 直接在此处定义
    }
  },
  {
    "operation": "default",
    "spec": {
      "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
    }
  },
  {
    "operation": "sort" // 可选操作,用于对输出JSON的键进行排序
  }
]

规范详解

shift 操作:数据重塑

这是最关键的一步。通过将所有输出路径修改为 data[0].X.value,我们指示JOLT:

  • 将所有输入字段的值映射到名为 data 的数组中。
  • 所有这些值都将作为键值对,放置在 data 数组的 第一个 元素(索引为 0)内部。
  • 每个值都嵌套在一个以数字为键(如 6, 7 等)的对象中,该对象又包含一个 value 键。
  • "#table1": "to":这是一个JOLT的快捷方式,用于将常量值 table1 映射到输出JSON的 to 键。这使得我们不再需要单独的 default 操作来添加此字段。

default 操作:补充默认值

{
  "operation": "default",
  "spec": {
    "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
  }
}

此操作用于在输出JSON中添加一个名为 fieldsToReturn 的数组,其中包含指定的数字列表。这是一个独立的默认值添加,与 shift 操作的目标结构无关。

sort 操作(可选):排序字段

{
  "operation": "sort"
}

sort 操作会按照字母顺序对JSON对象的键进行排序。这通常是为了提高输出的可读性或确保输出的确定性,但对于解决核心的结构问题并非必需。

完整优化后的JOLT规范

结合所有优化和修正,最终的JOLT规范如下:

[
  {
    "operation": "shift",
    "spec": {
      "AssetID": "data[0].6.value",
      "AssetNumber": "data[0].7.value",
      "AssetMaterial": "data[0].8.value",
      "RackUnits": "data[0].RackUnits.value", // 示例:可以根据需要保留原始键名
      "MaterialType": "data[0].MaterialType.value",
      "AssetName": "data[0].9.value",
      "CustRID": "data[0].10.value",
      "SerialNumber": "data[0].11.value",
      "Room": "data[0].12.value",
      "Datacenter": "data[0].13.value",
      "UMountingID": "data[0].14.value",
      "CabinetAssetID": "data[0].15.value",
      "CabinetName": "data[0].16.value",
      "#table1": "to"
    }
  },
  {
    "operation": "default",
    "spec": {
      "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
    }
  },
  {
    "operation": "sort"
  }
]

注意:在上述 shift 规范中,我将 RackUnits 和 MaterialType 的目标键名从数字改回了原始键名,以展示灵活性。你可以根据实际需求选择使用数字或原始键名。

应用此规范后,JOLT将生成与期望输出完全一致的JSON结构。

总结与最佳实践

  • 固定数组索引:当需要将多个输入字段合并到数组中的单个对象时,务必在 shift 规范中使用固定的数组索引(例如 [0]),而非 []。[] 会为每个匹配项创建新的数组元素。
  • 规范优化:对于简单的常量值,可以直接在 shift 规范中使用 # 语法来定义,从而减少 default 操作的步骤,使JOLT规范更简洁高效。
  • 理解JOLT操作:深入理解 shift、default 等JOLT操作的工作原理是编写高效转换规范的关键。

通过掌握这些技巧,您可以更有效地利用JOLT进行复杂的数据重塑和转换,避免常见的结构性问题。

以上就是JOLT转换:将数组中多个独立对象合并为一个单一对象的详细内容,更多请关注其它相关文章!


# json  # 键值对  # 组中  # 多个  # 键值  # 第一个  # js  # 网站建设公司流量高  # 清远专业网站推广方法  # 郑州平台seo优化  # 商丘网站建设方案优化  # 流量指标和营销推广指标  # 如何看待会员网站推广  # 湖州抖音seo推广优化  # 梧州谷歌seo推荐  # 德阳网站建设联系电话  # 西部影视网站建设  # 并到  # 这是一个  # 您可以  # 键名  # 并为  # 如何用 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 修复二维数组索引越界异常:一维循环到二维坐标的正确映射  响应式图片在网页设计中的正确实现方法  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  红果短剧网页版官网入口 官方最新网址发布  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  动漫岛观看全网网 动漫岛在线正版动漫入口  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  yy漫画网页版官方入口_yy漫画官网登录页面链接  漫蛙漫画登录站点 漫蛙2正版漫画快速访问  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Win10双系统截图高效法 截屏快捷键速记【技巧】  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  小米汽车11月交付量突破40000台!雷军:将继续努力  Bing引擎入口最新2025 Bing搜索免费官方登录  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  期待已久:小米17 Ultra、小米首款NAS本月登场  深入理解Promise链:如何在catch后中断then的执行  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  Win10如何恢复误删的快捷方式_Win10重建常用软件快捷方式  Angular Material 垂直步进器:实现底部到顶部排序的教程  Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  b站赚钱渠道_b站收益来源  抖音网页版平台入口 抖音网页版官网在线访问教程  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  铁路12306的积分有效期是多久_铁路12306积分有效期说明  ArrayList与LinkedList操作复杂度详解:遍历与修改  126邮箱账号注册 电脑版登录入口  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  必由学官方登录入口 必由学教师学生账号快速访问  Golang指针如何与map组合使用_Golang map指针组合实践  微博网页版直接访问 微博网页版账号管理快速入口  Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  Archive of Our Own官网直达 AO3最新可用地址一览  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  PDF文件体积过大处理_PDF压缩技巧详解  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  抖音怎么赚钱_抖音创作者变现方法与途径指南  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  AO3镜像入口大全 AO3网页版内容访问全集  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  如何在J*a中使用Locale处理多语言环境  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐 

搜索