新闻中心

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

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

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

本文详细介绍了如何使用jolt转换规范,将json数组中原本独立的多个对象合并为一个单一对象。通过在`shift`操作中使用共同的数组索引`[0]`,可以有效消除不必要的嵌套层级,从而实现更紧凑、符合预期的输出结构。文章提供了具体的jolt配置示例和解释,帮助读者掌握此类复杂数据重塑技巧。

JOLT中的数组对象合并问题解析

在使用JOLT进行JSON数据转换时,一个常见的需求是将源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 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"
    }
  }
]

上述规范会产生以下输出,其中 data 数组的每个元素都是一个独立的JSON对象,包含了源JSON中的一个字段:

当前输出 JSON 示例:

{
  "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" } }
  ]
}

然而,我们期望的输出是将所有这些字段合并到 data 数组中的一个单一对象内,结构如下:

期望输出 JSON 示例:

{
  "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[].key.value 中的 [] 操作符。当JOLT遇到 [] 时,它会为每个匹配的源路径在目标数组中创建一个新的元素。为了将所有字段合并到数组的同一个元素中,我们需要指定一个共同的数组索引。最简单且常用的方法是使用 [0]。

将 data[].key.value 修改为 data[0].key.value 即可实现这一目标。这意味着所有转换后的字段都将被放置到 data 数组的第一个元素(索引为0)所代表的对象中。

Moshi Chat Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

Moshi Chat 160 查看详情 Moshi Chat

此外,原始JOLT规范中包含了一个冗余的 default 操作来添加 "to": "table1"。这个操作可以直接集成到 shift 规范中,通过使用 # 语法将常量值映射到目标路径。

优化后的 JOLT 转换规范

以下是经过优化和修正的JOLT规范,它将实现期望的输出结构:

[
  {
    "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"
      "#table1": "to" 
    }
  },
  {
    "operation": "default",
    "spec": {
      // 添加 fieldsToReturn 数组
      "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
    }
  },
  {
    "operation": "sort" // 可选操作,用于确保输出对象的键有序
  }
]

规范说明:

  1. shift 操作:

    • "AssetID": "data[0].6.value": 这里的关键是 data[0]。它指示JOLT将 AssetID 的值放置到 data 数组的第一个元素(索引为0)内部,并以 6.value 作为其路径。所有其他字段也同样使用 data[0],确保它们都被写入同一个对象。
    • "#table1": "to": 这是一个将常量值添加到输出的简洁方法。#table1 表示源数据中没有名为 table1 的字段,因此 JOLT 会将字符串 "table1" 作为值,并将其映射到目标路径 to。这替代了原先的第一个 default 操作。
  2. default 操作:

    • 此操作用于添加在输入JSON中不存在的默认字段。在这里,它用于添加 fieldsToReturn 数组。
  3. sort 操作 (可选):

    • sort 操作会按照键的字母顺序对JSON对象进行排序。这对于确保输出的确定性和可读性非常有用,尤其是在调试或比较输出时。

最终输出验证

使用上述优化后的JOLT规范对输入JSON进行转换,将得到完全符合期望的输出:

{
  "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 数组的单个对象中,并且 to 和 fieldsToReturn 字段也已正确添加。

总结与注意事项

  • 共同索引的关键作用: 当需要将多个源字段合并到目标数组的同一个对象中时,务必在 shift 规范中使用一个共同的数组索引(如 [0])。
  • 优化 default 操作: 对于添加常量值,可以直接在 shift 规范中使用 #value: "targetPath" 的语法,以减少JOLT规范的阶段数量,提高效率。
  • JOLT的灵活性: JOLT提供了强大的数据转换能力,但理解其操作符(特别是 [] 和 [index])的行为对于实现复杂的结构重塑至关重要。
  • 调试技巧: 在构建复杂的JOLT规范时,逐步测试每个操作阶段的输出,可以帮助定位问题并理解转换过程。

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


# 可选  # 长沙网站建设电商  # 学习优化网站关键词  # 吉安县seo品牌  # 丽水网站推广蔚芯hfqjwl下拉  # 黄冈seo关键词优化排名公司  # 棒球大联盟营销推广模式  # 文登信息港威海网站建设  # 阿里云网站建设案例分析  # 徐州虚拟网站建设市价  # 抖音seo福建  # 包含了  # js  # 可以直接  # 如何使用  # 并到  # 如何用  # 第一个  # 并为  # 组中  # 多个  # json数组  # json 


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


相关推荐: QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  c++ dfs和bfs代码 c++深度广度优先搜索算法  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法  单射、满射与双射的关系 一文理清所有逻辑  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  Go RPC HTTP服务正确实现与常见陷阱解析  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  美团外卖商家服务中心入口 美团商家版官网入口  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  微信网页版扫码登录入口 微信网页版二维码登录入口  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口  CSS Box Model与弹性按钮:维持布局稳定的动画实践  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  如何提高微信支付的安全性_微信支付安全防护与设置建议  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  Log4j Console Appender性能瓶颈与高并发优化策略  Eclipse怎么运行工程_Eclipse工程运行配置说明  汽水音乐在线版入口_汽水音乐网页播放手册  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  Shopware订单对象中获取产品自定义字段的正确方法  知音漫客正版漫画平台_知音漫客官网账号登录  腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  免费抖音短视频入口_抖音网页版短视频免费通道  Python大型XML文件高效流式解析教程  深入理解Promise链:如何在catch后中断then的执行  谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  现代化 SciPy 一维插值:interp1d 的替代方案与最佳实践  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  在Qt QML中通过Python字典动态更新TextEdit内容的教程  一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】  PDF文件体积过大处理_PDF压缩技巧详解  mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析  React Router v6 教程:构建认证保护的私有路由与重定向策略  将HTML动态表格多行数据保存到Google Sheet的教程  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】 

搜索