首页 > Java > java教程 > 正文

使用 Josson 库聚合 JSON 数组中具有相同键值的对象

DDD
发布: 2025-10-06 12:11:30
原创
693人浏览过

使用 josson 库聚合 json 数组中具有相同键值的对象

本文介绍了如何使用 Josson 库,根据特定条件(如 userid、groupname、segment 等)对 JSON 数组中的对象进行分组和聚合。通过 Josson 提供的强大功能,可以方便地对 JSON 数据进行转换和处理,实现按条件求和等复杂操作,最终生成期望的聚合结果。

使用 Josson 聚合 JSON 数据

在处理 JSON 数据时,经常会遇到需要根据某些键的值将数据分组,并对同一组内的数据进行聚合的情况。例如,给定一个包含交易记录的 JSON 数组,需要按照用户 ID、交易组和交易类型等条件将交易记录分组,并计算每组的总交易金额。手动编写代码实现这种聚合逻辑通常比较繁琐且容易出错。Josson 库提供了一种简洁高效的方式来完成这类任务。

1. 引入 Josson 库

首先,需要在项目中引入 Josson 库。可以通过 Maven 或 Gradle 等构建工具添加依赖。

Maven:

<dependency>
    <groupId>com.octomix.josson</groupId>
    <artifactId>josson</artifactId>
    <version>最新版本</version>
</dependency>
登录后复制

Gradle:

implementation 'com.octomix.josson:josson:最新版本'
登录后复制

请将 "最新版本" 替换为 Josson 库的实际版本号。

2. 加载 JSON 数据

使用 Josson 提供的 Josson.fromJsonString() 方法将 JSON 字符串加载到 Josson 对象中。

遨虾
遨虾

1688推出的跨境电商AI智能体

遨虾 69
查看详情 遨虾
import com.octomix.josson.Josson;
import com.octomix.josson.JsonNode;

public class JsonAggregation {

    public static void main(String[] args) throws Exception {
        String jsonString = "[{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"66CN-063CC\",\"symbol\":\"INX22\",\"exchange\":\"SGXFO\",\"expirydate\":\"24NOV2022\"," +
                "\"scripcode\":\"7536847\",\"securitytype\":\"FUT\",\"strikeprice\":0,\"opttype\":\"XX\",\"bfqty\":-107,\"bfrate\":18462.05,\"bfamt\":3950878.6999999997,\"buyqty\":21,\"sellqty\":59,\"netqty\":-38," +
                "\"cfqty\":-145,\"cfamt\":5358027.699999999,\"ltp\":\"18433.5\",\"grossmtm\":0,\"brokerageamt\":48,\"netmtm\":0,\"currency\":\"USD\",\"usdrate\":81.33,\"clientsharing\":50,\"broksharing\":0," +
                "\"comsharing\":50,\"multiplier\":2}," +
                "{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"CW05\",\"symbol\":\"NIFTY\",\"exchange\":\"NSEFO\"," +
                "\"expirydate\":\"24NOV2022\",\"scripcode\":\"61349\",\"securitytype\":\"OPT\",\"strikeprice\":17800,\"opttype\":\"CE\",\"bfqty\":4050,\"bfrate\":673.3,\"bfamt\":-2726865,\"buyqty\":1650," +
                "\"sellqty\":300,\"netqty\":1350,\"cfqty\":5400,\"cfamt\":-3677257.5,\"ltp\":\"657.0\",\"grossmtm\":0,\"brokerageamt\":1038.81126525,\"netmtm\":0,\"currency\":\"INR\",\"usdrate\":1,\"clientsharing\":0," +
                "\"broksharing\":0,\"comsharing\":100,\"multiplier\":1}," +
                "{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"CW05\",\"symbol\":\"NIFTY\",\"exchange\":\"NSEFO\"," +
                "\"expirydate\":\"24NOV2022\",\"scripcode\":\"61350\",\"securitytype\":\"OPT\",\"strikeprice\":17800,\"opttype\":\"PE\",\"bfqty\":-4050,\"bfrate\":14.7,\"bfamt\":59535,\"buyqty\":300,\"sellqty\":1650," +
                "\"netqty\":-1350,\"cfqty\":-5400,\"cfamt\":78900,\"ltp\":\"13.6\",\"grossmtm\":0,\"brokerageamt\":31.850901,\"netmtm\":0,\"currency\":\"INR\",\"usdrate\":1,\"clientsharing\":0,\"broksharing\":0," +
                "\"comsharing\":100,\"multiplier\":1}]";

        Josson josson = Josson.fromJsonString(jsonString);

        // ... (后续步骤)
    }
}
登录后复制

3. 使用 group() 函数进行分组

group() 函数允许你根据一个或多个键对 JSON 数组进行分组。map() 函数用于指定用于分组的键。

JsonNode node = josson.getNode(
    "group(map(userid,groupname,segment,accountcode,symbol,exchange,expirydate," +
    "          currency,usdrate,clientsharing,broksharing,comsharing,multiplier))" +
    ".map(key.userid," +
    "     key.groupname," +
    "     key.segment," +
    "     key.accountcode," +
    "     key.symbol," +
    "     key.exchange," +
    "     key.expirydate," +
    "     key.currency," +
    "     key.usdrate," +
    "     key.clientsharing," +
    "     key.broksharing," +
    "     key.comsharing," +
    "     key.multiplier," +
    "     elements.bfqty.sum()," +
    "     elements.bfrate.sum()," +
    "     elements.bfamt.sum()," +
    "     elements.buyqty.sum()," +
    "     elements.sellqty.sum()," +
    "     elements.netqty.sum()," +
    "     elements.cfqty.sum()," +
    "     elements.cfamt.sum()," +
    "     elements.ltp.sum()," +
    "     elements.grossmtm.sum()," +
    "     elements.brokerageamt.sum()," +
    "     elements.netmtm.sum())");
System.out.println(node.toPrettyString());
登录后复制

在这个例子中,group(map(userid,groupname,segment,accountcode,symbol,exchange,expirydate,currency,usdrate,clientsharing,broksharing,comsharing,multiplier)) 根据 userid、groupname、segment、accountcode、symbol、exchange、expirydate、currency、usdrate、clientsharing、broksharing、comsharing 和 multiplier 的组合值对数据进行分组。

4. 使用 map() 函数进行聚合

在 group() 函数之后,使用 map() 函数对每个分组中的数据进行聚合。key 引用分组键的值,elements 引用分组中的所有元素。

例如,elements.bfqty.sum() 计算每个分组中 bfqty 字段的总和。 可以对分组中的其他数值字段进行类似的操作,例如 bfrate、bfamt、buyqty 等。

5. 获取结果

getNode() 方法返回一个 JsonNode 对象,可以使用 toPrettyString() 方法将其转换为格式化的 JSON 字符串并打印出来。

完整代码示例

import com.octomix.josson.Josson;
import com.octomix.josson.JsonNode;

public class JsonAggregation {

    public static void main(String[] args) throws Exception {
        String jsonString = "[{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"66CN-063CC\",\"symbol\":\"INX22\",\"exchange\":\"SGXFO\",\"expirydate\":\"24NOV2022\"," +
                "\"scripcode\":\"7536847\",\"securitytype\":\"FUT\",\"strikeprice\":0,\"opttype\":\"XX\",\"bfqty\":-107,\"bfrate\":18462.05,\"bfamt\":3950878.6999999997,\"buyqty\":21,\"sellqty\":59,\"netqty\":-38," +
                "\"cfqty\":-145,\"cfamt\":5358027.699999999,\"ltp\":\"18433.5\",\"grossmtm\":0,\"brokerageamt\":48,\"netmtm\":0,\"currency\":\"USD\",\"usdrate\":81.33,\"clientsharing\":50,\"broksharing\":0," +
                "\"comsharing\":50,\"multiplier\":2}," +
                "{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"CW05\",\"symbol\":\"NIFTY\",\"exchange\":\"NSEFO\"," +
                "\"expirydate\":\"24NOV2022\",\"scripcode\":\"61349\",\"securitytype\":\"OPT\",\"strikeprice\":17800,\"opttype\":\"CE\",\"bfqty\":4050,\"bfrate\":673.3,\"bfamt\":-2726865,\"buyqty\":1650," +
                "\"sellqty\":300,\"netqty\":1350,\"cfqty\":5400,\"cfamt\":-3677257.5,\"ltp\":\"657.0\",\"grossmtm\":0,\"brokerageamt\":1038.81126525,\"netmtm\":0,\"currency\":\"INR\",\"usdrate\":1,\"clientsharing\":0," +
                "\"broksharing\":0,\"comsharing\":100,\"multiplier\":1}," +
                "{\"userid\":\"CNAF01\",\"groupname\":\"Abhay\",\"segment\":\"CosCLFIN\",\"accountcode\":\"CW05\",\"symbol\":\"NIFTY\",\"exchange\":\"NSEFO\"," +
                "\"expirydate\":\"24NOV2022\",\"scripcode\":\"61350\",\"securitytype\":\"OPT\",\"strikeprice\":17800,\"opttype\":\"PE\",\"bfqty\":-4050,\"bfrate\":14.7,\"bfamt\":59535,\"buyqty\":300,\"sellqty\":1650," +
                "\"netqty\":-1350,\"cfqty\":-5400,\"cfamt\":78900,\"ltp\":\"13.6\",\"grossmtm\":0,\"brokerageamt\":31.850901,\"netmtm\":0,\"currency\":\"INR\",\"usdrate\":1,\"clientsharing\":0,\"broksharing\":0," +
                "\"comsharing\":100,\"multiplier\":1}]";

        Josson josson = Josson.fromJsonString(jsonString);

        JsonNode node = josson.getNode(
            "group(map(userid,groupname,segment,accountcode,symbol,exchange,expirydate," +
            "          currency,usdrate,clientsharing,broksharing,comsharing,multiplier))" +
            ".map(key.userid," +
            "     key.groupname," +
            "     key.segment," +
            "     key.accountcode," +
            "     key.symbol," +
            "     key.exchange," +
            "     key.expirydate," +
            "     key.currency," +
            "     key.usdrate," +
            "     key.clientsharing," +
            "     key.broksharing," +
            "     key.comsharing," +
            "     key.multiplier," +
            "     elements.bfqty.sum()," +
            "     elements.bfrate.sum()," +
            "     elements.bfamt.sum()," +
            "     elements.buyqty.sum()," +
            "     elements.sellqty.sum()," +
            "     elements.netqty.sum()," +
            "     elements.cfqty.sum()," +
            "     elements.cfamt.sum()," +
            "     elements.ltp.sum()," +
            "     elements.grossmtm.sum()," +
            "     elements.brokerageamt.sum()," +
            "     elements.netmtm.sum())");
        System.out.println(node.toPrettyString());
    }
}
登录后复制

注意事项

  • 确保 JSON 字符串的格式正确,否则 Josson 可能会抛出异常。
  • 根据实际需求调整分组键和聚合函数
  • Josson 提供了丰富的函数和操作符,可以实现更复杂的 JSON 数据转换和处理。 请参考 Josson 的官方文档了解更多信息。

总结

Josson 库提供了一种强大而简洁的方式来聚合 JSON 数组中的数据。通过 group() 和 map() 函数,可以轻松地根据特定条件对数据进行分组和聚合,从而简化了 JSON 数据处理的复杂性。 掌握 Josson 库的使用,可以大大提高处理 JSON 数据的效率。

以上就是使用 Josson 库聚合 JSON 数组中具有相同键值的对象的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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