
本文介绍了如何使用 Josson 库,根据特定条件(如 userid、groupname、segment 等)对 JSON 数组中的对象进行分组和聚合。通过 Josson 提供的强大功能,可以方便地对 JSON 数据进行转换和处理,实现按条件求和等复杂操作,最终生成期望的聚合结果。
使用 Josson 聚合 JSON 数据
在处理 JSON 数据时,经常会遇到需要根据某些键的值将数据分组,并对同一组内的数据进行聚合的情况。例如,给定一个包含交易记录的 JSON 数组,需要按照用户 ID、交易组和交易类型等条件将交易记录分组,并计算每组的总交易金额。手动编写代码实现这种聚合逻辑通常比较繁琐且容易出错。Josson 库提供了一种简洁高效的方式来完成这类任务。
1. 引入 Josson 库
首先,需要在项目中引入 Josson 库。可以通过 Maven 或 Gradle 等构建工具添加依赖。
Maven:
com.octomix.josson josson 最新版本
Gradle:
implementation 'com.octomix.josson:josson:最新版本'
请将 “最新版本” 替换为 Josson 库的实际版本号。
2. 加载 JSON 数据
使用 Josson 提供的 Josson.fromJsonString() 方法将 JSON 字符串加载到 Josson 对象中。
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 数组中具有相同键值的对象的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/37623.html
微信扫一扫
支付宝扫一扫