本文将介绍如何使用 Josson 库,通过两个不同的 json 数组中相同的键,来更新 JSON 数组中的 JSON 对象。通过 Josson 的数据集连接操作,可以高效地实现数据的合并和更新,避免了复杂的嵌套循环和条件判断,从而简化了代码并提高了可读性。
Josson 库简介
Josson 是一个强大的 JSON 处理库,它提供了一系列便捷的方法来查询、转换和操作 JSON 数据。其中,数据集连接操作是 Josson 的一个重要特性,它允许用户基于指定的键,将多个 JSON 数组连接起来,从而实现数据的合并和更新。
示例代码
以下代码演示了如何使用 Josson 库来更新 JSON 数组中具有相同键的 JSON 对象:
import com.fasterxml.jackson.databind.JsonNode; import net.octomix.josson.Josson; import net.octomix.josson.JossonException; import net.octomix.josson.Jossons; public class JsonUpdateExample { public static void main(String[] args) { try { Jossons jossons = new Jossons(); // Deserialization jossons.putDataset("http", Josson.fromJsonString("[{"userid":"CNRM04","groupname":"Rohit",n" + ""segment":"cosPROFIN","accountcode":"OWN","symbol":"NIFTY","exchange":"NSEFO",n" + ""expirydate":"03NOV2022","scripcode":"38021","securitytype":"OPT",n" + ""strikeprice":17700,"opttype":"PE","bfqty":-1500,"bfrate":122.35,n" + ""bfamt":18352.5,"buyqty":0,"sellqty":0,"netqty":0,"cfqty":-150,n" + ""cfamt":18352.5,"ltp":0,"grossmtm":0,"brokerageamt":0,"netmtm":0,n" + ""currency":"INR","usdrate":1,"clientsharing":0,"broksharing":0,n" + ""comsharing":100,"multiplier":1},{"userid":"CNRM04","groupname":"Rohit",n" + ""segment":"CosPROFIN","accountcode":"OWN","symbol":"NIFTY",n" + ""exchange":"NSEFO","expirydate":"03NOV2022","scripcode":"38026",n" + ""securitytype":"OPT","strikeprice":17800,"opttype":"PE","bfqty":0,n" + ""bfrate":0,"bfamt":0,"buyqty":10800,"sellqty":15000,"netqty":-4200,n" + ""cfqty":-4200,"cfamt":590729.9999999998,"ltp":0,"grossmtm":0,n" + ""brokerageamt":3400.2888479999992,"netmtm":0,"currency":"INR",n" + ""usdrate":1,"clientsharing":0,"broksharing":0,"comsharing":100,n" + ""multiplier":11},{"userid":"CNC01","groupname":"abhishek",n" + ""segment":"Cosmic","accountcode":"APP","symbol":"NIFTY",n" + ""exchange":"NSEFO","expirydate":"03NOV2022","scripcode":"40034",n" + ""securitytype":"OPT","strikeprice":1200,"opttype":"PE","bfqty":12,n" + ""bfrate":2,"bfamt":0,"buyqty":100,"sellqty":121,"netqty":200,n" + ""cfqty":11,"cfamt":78,"ltp":9,"grossmtm":0,"brokerageamt":12222,n" + ""netmtm":45,"currency":"INR","usdrate":2,"clientsharing":0,"broksharing":0,"comsharing":0,n" + ""multiplier":99}]")); jossons.putDataset("websocket", Josson.fromJsonString("[{"userid":"CNRM04","groupname":"Rohit","segment":"CosPROFIN","accountcode":"OWN","symbol":"NIFTY","exchange":"NSEFO","expirydate":"03NOV2022","scripcode":"38021","securitytype":"OPT","strikeprice":17700,"opttype":"PE","bfqty":20,"bfrate":122.35,"bfamt":18352.5,"buyqty":0,"sellqty":0,"netqty":0,"cfqty":-150,"cfamt":18352.5,"ltp":0,"grossmtm":0,"brokerageamt":0,"netmtm":0,"currency":"INR","usdrate":1,"clientsharing":0,"broksharing":0,"comsharing":100,"multiplier":1},{"userid":"CNRM04","groupname":"Rohit","segment":"CosPROFIN","accountcode":"OWN","symbol":"NIFTY","exchange":"NSEFO","expirydate":"03NOV2022","scripcode":"38026","securitytype":"OPT","strikeprice":17800,"opttype":"PE","bfqty":30,"bfrate":0,"bfamt":0,"buyqty":10800,"sellqty":15000,"netqty":-4200,"cfqty":-4200,"cfamt":590729.9999999998,"ltp":0,"grossmtm":0,"brokerageamt":3400.2888479999992,"netmtm":0,"currency":"INR","usdrate":1,"clientsharing":0,"broksharing":0,"comsharing":100,"multiplier":1}]]")); // Left Join operation JsonNode node = jossons.evaluateQuery( "http{userid,scripcode} <=< websocket->map(userid,scripcode,bfqty){userid,scripcode}"); System.out.println(node.toPrettyString()); } catch (JossonException e) { e.printStackTrace(); } } }
代码解释:
- 导入 Josson 库: 引入必要的 Josson 库。
- 创建 Jossons 对象: 创建一个 Jossons 对象,用于管理数据集。
- 加载 JSON 数据: 使用 putDataset 方法将两个 JSON 数组分别加载到名为 “http” 和 “websocket” 的数据集中。Josson.fromJsonString 方法用于将 JSON 字符串转换为 Josson 可以处理的格式。
- 执行 Left Join 操作: 使用 evaluateQuery 方法执行 Left Join 操作。
- http{userid,scripcode}: 指定 “http” 数据集,并选择 userid 和 scripcode 作为连接键。
- websocket->map(userid,scripcode,bfqty){userid,scripcode}: 指定 “websocket” 数据集,使用 map 函数选择 userid, scripcode 和 bfqty 字段,并选择 userid 和 scripcode 作为连接键。
- 输出结果: 使用 toPrettyString 方法将结果 JSON 节点格式化并输出到控制台。
输出结果:
[ { "userid" : "CNRM04", "groupname" : "Rohit", "segment" : "CosPROFIN", "accountcode" : "OWN", "symbol" : "NIFTY", "exchange" : "NSEFO", "expirydate" : "03NOV2022", "scripcode" : "38021", "securitytype" : "OPT", "strikeprice" : 17700, "opttype" : "PE", "bfqty" : 20, "bfrate" : 122.35, "bfamt" : 18352.5, "buyqty" : 0, "sellqty" : 0, "netqty" : 0, "cfqty" : -150, "cfamt" : 18352.5, "ltp" : 0, "grossmtm" : 0, "brokerageamt" : 0, "netmtm" : 0, "currency" : "INR", "usdrate" : 1, "clientsharing" : 0, "broksharing" : 0, "comsharing" : 100, "multiplier" : 1 }, { "userid" : "CNRM04", "groupname" : "Rohit", "segment" : "CosPROFIN", "accountcode" : "OWN", "symbol" : "NIFTY", "exchange" : "NSEFO", "expirydate" : "03NOV2022", "scripcode" : "38026", "securitytype" : "OPT", "strikeprice" : 17800, "opttype" : "PE", "bfqty" : 30, "bfrate" : 0, "bfamt" : 0, "buyqty" : 10800, "sellqty" : 15000, "netqty" : -4200, "cfqty" : -4200, "cfamt" : 590729.9999999998, "ltp" : 0, "grossmtm" : 0, "brokerageamt" : 3400.2888479999992, "netmtm" : 0, "currency" : "INR", "usdrate" : 1, "clientsharing" : 0, "broksharing" : 0, "comsharing" : 100, "multiplier" : 11 }, { "userid" : "CNC01", "groupname" : "abhishek", "segment" : "Cosmic", "accountcode" : "APP", "symbol" : "NIFTY", "exchange" : "NSEFO", "expirydate" : "03NOV2022", "scripcode" : "40034", "securitytype" : "OPT", "strikeprice" : 1200, "opttype" : "PE", "bfqty" : 12, "bfrate" : 2, "bfamt" : 0, "buyqty" : 100, "sellqty" : 121, "netqty" : 200, "cfqty" : 11, "cfamt" : 78, "ltp" : 9, "grossmtm" : 0, "brokerageamt" : 12222, "netmtm" : 45, "currency" : "INR", "usdrate" : 2, "clientsharing" : 0, "broksharing" : 0, "comsharing" : 0, "multiplier" : 99 } ]
可以看到,http 数组中 userid 和 scripcode 与 websocket 数组匹配的对象的 bfqty 字段已成功更新。
注意事项
- 确保 Josson 库已添加到项目的依赖项中。可以使用 maven 或 gradle 等构建工具来管理依赖项。
- 理解 Left Join 操作的含义。Left Join 会保留左侧数据集的所有记录,并将右侧数据集匹配的记录合并到左侧。如果右侧数据集中没有匹配的记录,则右侧数据集的字段将为 NULL。
- 根据实际需求调整连接键和需要更新的字段。
总结
使用 Josson 库可以方便地实现 JSON 数组中对象的更新操作。通过数据集连接操作,可以避免复杂的循环和条件判断,从而简化代码并提高可读性。在处理 JSON 数据时,Josson 库是一个强大的工具,值得学习和掌握。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END