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


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 数组中包含了多个独立的 {} 对象,每个对象只包含一个键值对,这与我们的期望不符。

Claude Claude

Anthropic发布的与ChatGPT竞争的聊天机器人

Claude 1166 查看详情 Claude

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

解决此问题的关键在于,在 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 转换中数组对象合并与结构优化指南的详细内容,更多请关注其它相关文章!


# json  # 楚雄州网站推广托管  # 黄岩seo软件细节  # 南京网站推广办法最新版  # 如何使用  # 并为  # 该如何  # 并到  # 第一个  # 结构优化  # 组中  # 键值  # 并与  # 多个  # 排列  # 键值对  # 常见问题  # js  # 南岸的网站推广哪家好  # 余姚网站关键词优化推广  # 杭州正规seo 广告  # 社群推广网络营销案例  # 深圳全网营销推广思路  # 十大免费网站推广排名  # 食品网站建设素材视频 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 实现二叉树的层序插入:基于树大小的路径导航  抖音号升级成企业资质怎么弄?有什么好处?  汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口  铁路12306怎么申请退票_铁路12306退票申请操作流程  《图怪兽》退出登录方法  iQOO手机信号差网络不稳定怎么办 信号问题原因排查与增强设置【攻略】  Golang如何操作指针参数_Go pointer参数传递规则  手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】  Go Template中优雅处理循环最后一项:自定义函数实践  《三国:谋定天下》平民全阶段通用阵容  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解  有道AI翻译入口 智能写作官方网站入口  search中maxlength属性用法解析  餐馆菜篮选购指南  2025考研成绩查询时间入口分享  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  PHP实现等比数列:构建数组元素基于前一个值递增的方法  Leaflet地图弹出窗口图片动态显示:避免缺失图标的专业指南  C++二维数组动态分配方法_C++指针与数组内存布局  为什么XML解析器对大小写敏感? 理解XML规范中的大小写规则与最佳实践  向往的生活小游戏启动处_向往的生活小游戏立即启动  德邦物流在线查询系统 德邦快递货物运输追踪  Sublime怎么格式化HTML代码_Sublime前端代码美化插件使用指南  Flexbox布局:实现粘性导航与底部页脚的完美结合  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  微博网页版入口链接 微博网页版在线互动平台  实时数据流中高效查找最小值与最大值  如何查询个人病历记录  Python高效统计字典嵌套列表值在目标列表中的出现次数  Composer reinstall命令重装损坏的包  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  抖音手机分身两个账号怎么切换?分身两个系统是一样的吗?  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  百度竞价WAP显示PC链接问题  163邮箱网页版官方登录入口 163邮箱网页版访问页面  Golang如何测试结构体方法_Golang reflect方法测试与调用技巧  荣耀magicv5怎么上手测评  管理打开的编辑器:固定、分组和关闭技巧  支付宝如何解绑云闪付_支付宝与云闪付账户关联解除方法  附近酒吧怎么找?  如何定制PrimeNG Sidebar的背景颜色  向日葵客户端怎么进行语音通话_向日葵客户端语音通话功能使用方法  在VS Code中进行数据科学和机器学习开发  《淘宝联盟》推广自己的店铺方法  键盘测试软件哪个好_键盘故障检测工具推荐  汽车之家网页版免费登录_汽车之家官网首页直接进入  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  英雄联盟争者留名活动介绍  PHP安全加载非公开目录图片与动态内容类型处理指南 

 2025-12-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.