新闻中心

JOLT 转换中数组对象合并与结构优化指南

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

JOLT 转换中数组对象合并与结构优化指南

本教程详细阐述了如何在使用 jolt 进行 json 转换时,解决将多个独立对象合并为一个数组内单一对象的常见问题。通过调整 jolt shift 操作中的数组索引策略,即从动态索引 [] 改为固定索引 [0],可以有效消除冗余的 {} 结构。文章还提供了优化 jolt 规范的技巧,包括将 default 操作整合到 shift 阶段,以构建更高效、更符合预期的 json 输出。

JOLT 数组对象合并与结构优化

在使用 JOLT 进行 JSON 数据转换时,经常会遇到需要将源数据中的多个字段映射到目标 JSON 结构中一个数组内的单一对象。然而,如果处理不当,JOLT 可能会为数组中的每个字段创建独立的子对象,导致输出结构与预期不符。本文将详细介绍如何通过精确控制 JOLT shift 操作中的数组索引来解决这一问题,并提供优化 JOLT 规范的实践建议。

问题场景与输入/输出示例

假设我们有一个扁平的输入 JSON 对象,需要将其中的一部分字段转换为目标 JSON 结构中 data 数组内的一个单一对象,每个字段对应一个带 value 键的嵌套结构。

输入 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"
}

期望输出 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[]..value 这样的路径。这会导致 JOLT 为每个 shift 操作在 data 数组中创建一个新的对象,而不是将所有字段合并到一个对象中。

导致问题的 JOLT Spec 示例:

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

上述 Spec 产生的输出 JSON (带有冗余 {}):

{
  "data": [
    {
      "6": {
        "value": "1"
      }
    },
    {
      "7": {
        "value": "2"
      }
    },
    {
      "8": {
        "value": "Cisco MDS 9706"
      }
    },
    // ... 更多独立的子对象 ...
    {
      "16": {
        "value": "CAB666"
      }
    }
  ],
  "to": "table1",
  "fieldsToReturn": [ 6, 7, 8, 9, 10, 11, 12 ]
}

可以看到,data 数组中包含了多个独立的 {} 对象,每个对象只包含一个键值对,这与我们的期望不符。

Writer Writer

企业级AI内容创作工具

Writer 220 查看详情 Writer

解决方案:使用固定数组索引

解决此问题的关键在于,在 shift 操作中,为所有需要合并到同一数组元素的字段指定一个固定的数组索引,而不是使用 [] 动态生成新索引。例如,使用 data[0] 将所有字段都映射到 data 数组的第一个元素中。

优化后的 JOLT Spec:

[
  {
    "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",
      // 将 "to" 字段直接整合到 shift 阶段
      "#table1": "to"
    }
  },
  {
    "operation": "default",
    "spec": {
      "fieldsToReturn": [6, 7, 8, 9, 10, 11, 12]
    }
  },
  {
    "operation": "sort"
  }
]

解释:

  • 通过将所有目标路径中的 data[] 替换为 data[0],JOLT 会将所有匹配的输入字段值都写入 data 数组的第一个元素中。由于它们都指向同一个目标对象,因此会自然地合并为一个对象。
  • "#table1": "to" 是一种 JOLT 的语法糖,它表示将字符串字面量 "table1" 作为值,映射到目标路径 to。这种方式比单独使用一个 default 操作来添加静态值更为简洁和高效。

进一步优化与注意事项

  1. 整合 default 操作: 原始的 default 操作用于添加 "to": "table1" 可以直接整合到 shift 阶段,如上述优化后的 Spec 所示,使用 "#": "" 语法。
  2. sort 操作: sort 操作可以确保输出 JSON 对象的键值对按照字母顺序排列,这在某些场景下有助于保持输出的一致性,但并非强制要求。
  3. fieldsToReturn 的处理: fieldsToReturn 数组的添加仍然需要一个 default 操作,因为它是一个静态数组,不依赖于输入字段的转换。将其放在 shift 之后是合理的。

最终的 JOLT Spec 和输出

结合上述优化,最终推荐的 JOLT Spec 如下:

[
  {
    "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": [6, 7, 8, 9, 10, 11, 12] // 添加静态数组
    }
  },
  {
    "operation": "sort" // 可选:对输出对象进行排序
  }
]

使用此 Spec 进行转换,将得到完全符合期望的输出:

{
  "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 操作中,如何通过使用固定的数组索引(如 data[0])而非动态索引(data[]),来有效地将多个输入字段合并到目标数组中的单一对象。这种方法避免了生成冗余的 {} 结构,使输出 JSON 更符合预期。同时,我们还探讨了将静态值添加操作整合到 shift 阶段,以及使用 sort 操作进行输出优化的技巧,从而编写出更简洁、高效的 JOLT 转换规范。理解 JOLT 中数组索引的工作原理是实现复杂 JSON 结构转换的关键。

以上就是JOLT 转换中数组对象合并与结构优化指南的详细内容,更多请关注其它相关文章!


# 并到  # 最新产品推广营销模式  # 漳州网站建设原创  # 优化网站联系电话  # 江西电商网站推广销售  # 西安美食营销推广招聘  # 面试网络营销推广专员  # 专注seo排名  # 岳阳建设商城网站公司  # 长安区营销推广招聘信息  # 济南网站建设框架制作  # 如何使用  # 并为  # js  # 第一个  # 结构优化  # 组中  # 键值  # 如何用  # 并与  # 多个  # 排列  # 键值对  # 常见问题  # json 


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


相关推荐: 如何提高微信支付的安全性_微信支付安全防护与设置建议  TikTok网页版直接登录 TikTok网页端官方平台入口  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  J*aScript中赋值与自增运算符的复杂交互与执行机制  2026年CSGO开箱网站推荐 CSGO开箱平台精选  在Go Martini框架中高效服务动态生成图像的实践指南  快手网页版在线登录 快手网页版官网入口快速访问  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  快手官方唯一登录入口 谨防山寨钓鱼网站  Android Studio计算器C键功能异常排查与修复教程  百度网盘网页版入口 百度网盘网页版官方登录网址  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  快手赚钱渠道_快手收益来源  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  12306选座系统怎么选连座_12306选座多人连坐操作方法  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  解决Flask中Quill编辑器内容提交失败及TypeError的指南  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  Lar*el DB::listen 事件中的查询执行时间单位解析  Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接  夸克浏览器桌面版同步不了书签怎么处理 夸克浏览器跨设备同步异常解决方案  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  J*aScript实现单选按钮与关联输入框的联动禁用教程  微信语音通话掉线如何解决 微信语音通话稳定优化方法  Go语言中动态执行代码字符串的策略与实践  优化大型XML文件解析:基于Python流式处理的内存高效方案  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  微信客户端如何收红包_微信客户端接收红包使用教程  QQ邮箱稳定登录入口_QQ邮箱官方网站网页版使用  J*a TimerTask中HashMap意外清空的深层原因与解决方案  J*aScript中高效管理与清空动态列表:避免循环陷阱  大象笔记网页版入口 印象笔记网页版登录入口  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  J*a里如何使用forEach遍历Map_Map遍历方法说明  离线运行Go语言之旅:本地部署与GOPATH配置指南  支付宝如何设置安全保护_支付宝安全设置的全面教程  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  b站赚钱渠道_b站收益来源  Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略  邮政快递包裹最新位置 邮政快递实时追踪入口 

搜索