
本文介绍了如何使用 Josson 库,在 Java 环境中,根据特定条件对 JSON 数组中的数据进行聚合。通过 Josson 提供的强大转换功能,可以高效地对 JSON 数据进行分组、映射和求和等操作,最终生成满足特定格式要求的 JSON 输出。
使用 Josson 聚合 JSON 数据
在处理 JSON 数据时,经常需要根据某些条件对数据进行聚合,例如,将具有相同用户ID、组名和片段的数据进行合并,并对特定字段进行求和。Josson 是一个强大的 JSON 处理库,可以方便地实现这种需求。
引入 Josson 库
首先,需要在项目中引入 Josson 库。可以通过 Maven 或 Gradle 添加依赖:
Maven:
com.octomix josson 最新版本
Gradle:
implementation 'com.octomix:josson:最新版本' // 请替换为最新版本
示例代码
以下是一个使用 Josson 聚合 JSON 数据的示例:
import com.octomix.josson.Josson;
import com.octomix.josson.JsonNode;
import javax.json.JsonString;
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());
}
}代码解释:
- Josson.fromJsonString(jsonString): 将 JSON 字符串解析为 Josson 对象。
-
josson.getNode(...): 使用 Josson 表达式进行数据转换。
- group(map(...)): 根据 map 中指定的键(userid, groupname, segment, accountcode, symbol, exchange, expirydate, currency, usdrate, clientsharing, broksharing, comsharing, multiplier)对 JSON 数组进行分组。
- .map(...): 对每个分组后的元素进行映射,提取分组键的值,并对 elements 中的数值字段进行求和。elements 代表每个分组中的 JSON 对象数组。
输出结果
上述代码的输出结果如下:
[ {
"userid" : "CNAF01",
"groupname" : "Abhay",
"segment" : "CosCLFIN",
"accountcode" : "66CN-063CC",
"symbol" : "INX22",
"exchange" : "SGXFO",
"expirydate" : "24NOV2022",
"currency" : "USD",
"usdrate" : 81.33,
"clientsharing" : 50,
"broksharing" : 0,
"comsharing" : 50,
"multiplier" : 2,
"bfqty" : -107.0,
"bfrate" : 18462.05,
"bfamt" : 3950878.6999999997,
"buyqty" : 21.0,
"sellqty" : 59.0,
"netqty" : -38.0,
"cfqty" : -145.0,
"cfamt" : 5358027.699999999,
"ltp" : 18433.5,
"grossmtm" : 0.0,
"brokerageamt" : 48.0,
"netmtm" : 0.0
}, {
"userid" : "CNAF01",
"groupname" : "Abhay",
"segment" : "CosCLFIN",
"accountcode" : "CW05",
"symbol" : "NIFTY",
"exchange" : "NSEFO",
"expirydate" : "24NOV2022",
"currency" : "INR",
"usdrate" : 1,
"clientsharing" : 0,
"broksharing" : 0,
"comsharing" : 100,
"multiplier" : 1,
"bfqty" : 0.0,
"bfrate" : 688.0,
"bfamt" : -2667330.0,
"buyqty" : 1950.0,
"sellqty" : 1950.0,
"netqty" : 0.0,
"cfqty" : 0.0,
"cfamt" : -3598357.5,
"ltp" : 670.6,
"grossmtm" : 0.0,
"brokerageamt" : 1070.66216625,
"netmtm" : 0.0
} ]注意事项
- 确保 Josson 库的版本是最新的,以便获得最佳性能和最新的功能。
- Josson 表达式需要仔细编写,确保分组和映射的键正确。
- 如果 JSON 数据量很大,可以考虑使用流式处理来提高性能。
总结
Josson 库提供了一种简洁而强大的方式来聚合 JSON 数据。通过使用 Josson 表达式,可以方便地对 JSON 数据进行分组、映射和求和等操作,从而满足各种数据处理需求。 在处理复杂的 JSON 数据转换时,Josson 是一个非常有用的工具。










