0

0

Jolt 数据转换:计算 JSON 对象中所有数值的总和

花韻仙語

花韻仙語

发布时间:2025-07-23 14:54:01

|

549人浏览过

|

来源于php中文网

原创

jolt 数据转换:计算 json 对象中所有数值的总和

Jolt 数据转换是一种强大的 JSON 结构重塑工具。本文将详细介绍如何使用 Jolt 的 shift 和 modify-overwrite-beta 操作,将 JSON 对象中特定字段的所有数值进行求和,并将结果添加为新的字段,同时保留原始数据结构,适用于需要聚合数值并扩展 JSON 结构的场景。

在处理 JSON 数据时,我们经常需要对特定字段的数值进行聚合计算,例如求和、平均值等。Jolt 提供了灵活的转换规则来应对这类需求。本文将以一个具体的例子,演示如何利用 Jolt 将一个 JSON 对象中所有子字段的数值进行求和,并将总和作为一个新字段添加到输出中。

场景描述与目标

假设我们有如下的输入 JSON 数据,其中 accounts 对象包含了多个账户及其对应的数值:

{
  "accounts": {
    "canara": 1,
    "sbi": 0,
    "axis": 1,
    "hdfc": 0
  }
}

我们的目标是计算 accounts 对象中所有数值(1, 0, 1, 0)的总和,并将这个总和作为名为 "total accounts" 的新字段添加到 JSON 的根级别,同时保留原始的账户信息。期望的输出如下:

{
  "canara": 1,
  "sbi": 0,
  "axis": 1,
  "hdfc": 0,
  "total accounts": 2
}

Jolt 转换规则详解

为了实现上述目标,我们将构建一个包含三个操作步骤的 Jolt 规范。这三个步骤协同工作,分别负责数据的提取、计算和最终的结构整理。

步骤一:提取并收集数值

首先,我们需要将 accounts 对象中的所有键值对提升到根级别,并同时将所有的数值收集到一个临时的数组中,以便后续进行求和。

Jolt 规范片段:

[
  {
    "operation": "shift",
    "spec": {
      "accounts": {
        "*": [
          ".&",
          "accountsAccumulator"
        ]
      }
    }
  }
]

解释:

Android数据格式解析对象JSON用法 WORD版
Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
  • "operation": "shift":这是一个 shift 操作,用于重塑 JSON 结构。
  • "accounts": { ... }:匹配输入 JSON 中的 accounts 字段。
  • "*": [".&", "accountsAccumulator"]:这是核心的映射规则。
    • "*":匹配 accounts 对象下的所有键(例如 "canara", "sbi")。
    • ".&":将匹配到的值(例如 1)映射到其原始键(例如 "canara")在输出的根级别。这意味着 {"canara": 1} 会被提升为 {"canara": 1}。
    • "accountsAccumulator":同时,将匹配到的值(例如 1)收集到一个名为 accountsAccumulator 的数组中。由于 accountsAccumulator 没有指定键,Jolt 会自动将其作为数组处理,每次匹配到的值都会被追加到这个数组中。

经过此步骤后的中间结果:

{
  "canara": 1,
  "sbi": 0,
  "axis": 1,
  "hdfc": 0,
  "accountsAccumulator": [1, 0, 1, 0]
}

步骤二:计算总和

接下来,我们将使用 modify-overwrite-beta 操作来计算 accountsAccumulator 数组中所有数值的总和,并将结果赋值给一个新的字段 "total accounts"。

Jolt 规范片段:

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "total accounts": "=intSum(@(1,accountsAccumulator))"
    }
  }
]

解释:

  • "operation": "modify-overwrite-beta":这是一个 modify 操作的变体,用于在现有数据上进行计算并可能覆盖现有值。
  • "total accounts": "=intSum(@(1,accountsAccumulator))":
    • "total accounts":定义了要创建或修改的新字段名。
    • "=intSum(...)":调用 Jolt 内置的 intSum 函数来计算整数和。
    • @(1,accountsAccumulator):这是一个 Jolt 的引用路径表达式。
      • @ 表示引用当前上下文的数据。
      • (1,accountsAccumulator) 表示从当前层级向上回溯一层(即根级别),查找名为 accountsAccumulator 的字段。这将引用到上一步生成的 [1, 0, 1, 0] 数组。

经过此步骤后的中间结果:

{
  "canara": 1,
  "sbi": 0,
  "axis": 1,
  "hdfc": 0,
  "accountsAccumulator": [1, 0, 1, 0],
  "total accounts": 2
}

步骤三:清理与整理

最后一步是清理掉在转换过程中创建的临时字段 accountsAccumulator,并确保所有其他字段都保留在最终输出中。

Jolt 规范片段:

[
  {
    "operation": "shift",
    "spec": {
      "accountsAccumulator": null,
      "*": "&"
    }
  }
]

解释:

  • "operation": "shift":再次使用 shift 操作进行结构整理。
  • "accountsAccumulator": null:将 accountsAccumulator 字段映射到 null,这在 shift 操作中意味着该字段将被移除。
  • "*": "&":这是一个通配符规则,表示将所有其他字段(即 canara, sbi, axis, hdfc, total accounts)原样保留在当前层级。& 表示将匹配到的键和值都保持不变。

经过此步骤后的最终结果:

{
  "canara": 1,
  "sbi": 0,
  "axis": 1,
  "hdfc": 0,
  "total accounts": 2
}

完整的 Jolt 规范

将上述三个步骤组合起来,就得到了完整的 Jolt 转换规范:

[
  {
    "operation": "shift",
    "spec": {
      "accounts": {
        "*": [
          ".&",
          "accountsAccumulator"
        ]
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "total accounts": "=intSum(@(1,accountsAccumulator))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "accountsAccumulator": null,
      "*": "&"
    }
  }
]

使用示例

输入 JSON:

{
  "accounts": {
    "canara": 1,
    "sbi": 0,
    "axis": 1,
    "hdfc": 0
  }
}

Jolt 规范:

[
  {
    "operation": "shift",
    "spec": {
      "accounts": {
        "*": [
          ".&",
          "accountsAccumulator"
        ]
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "total accounts": "=intSum(@(1,accountsAccumulator))"
    }
  },
  {
    "operation": "shift",
    "spec": {
      "accountsAccumulator": null,
      "*": "&"
    }
  }
]

输出 JSON:

{
  "canara": 1,
  "sbi": 0,
  "axis": 1,
  "hdfc": 0,
  "total accounts": 2
}

注意事项与总结

  • 操作顺序至关重要:Jolt 规范中的操作是按顺序执行的。本例中,必须先使用第一个 shift 收集数据,然后 modify-overwrite-beta 才能计算,最后再用第二个 shift 清理。
  • 数学函数选择:Jolt 的 modify 操作提供了多种数学函数,如 intSum (整数求和), doubleSum (浮点数求和), intMax (最大整数), doubleMin (最小浮点数) 等。根据数据类型选择合适的函数。
  • 临时字段的使用:为了实现复杂的转换,创建临时字段(如 accountsAccumulator)是一种常见且有效的策略。在转换完成后,记得清理这些临时字段以保持输出的整洁。
  • 路径表达式的灵活运用:@(1,fieldName) 这种路径表达式在 Jolt 中非常强大,它允许我们从当前操作的上下文向上或向下引用数据。
  • 可扩展性:如果 accounts 内部的结构发生变化,或者需要对其他类似的数值集合进行求和,只需要调整 shift 规则中的路径即可。

通过上述教程,我们详细了解了如何利用 Jolt 的 shift 和 modify-overwrite-beta 操作,高效地实现 JSON 对象中数值的聚合计算。掌握这些核心概念和技巧,将有助于您在数据处理中更灵活地运用 Jolt 进行复杂的 JSON 转换。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

14

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号