在jsonnode上应用一些条件,并在Java中过滤结果集



我有一个Jsonnodes数组。类似的东西

[
{
"coupon": "VAR",
"currency": "USD",
"sip": "94989WAX5",
"lastModifiedDate": "2022-09-23T08:16:25Z"
},
{
"coupon": "VAR1",
"currency": "USD",
"sip": "94989WAX5",
"lastModifiedDate": "2022-09-21T08:16:25Z"
},
{
"coupon": "VAR3",
"currency": "USD",
"sip": "XHBRYWEB1",
"lastModifiedDate": "2022-09-20T08:16:25Z"
}
]

我有一个要求,如果两个节点的sip值相同,那么我只需要选择lastModifiedDate是最新的sip。在上面的例子中,最终的输出应该是剩下的两个节点。

[
{
"coupon": "VAR",
"currency": "USD",
"sip": "94989WAX5",
"lastModifiedDate": "2022-09-23T08:16:25Z"
},
{
"coupon": "VAR3",
"currency": "USD",
"sip": "XHBRYWEB1",
"lastModifiedDate": "2022-09-20T08:16:25Z"
}
]

我试图通过创建HashMap<String,JsonNode>来解决这个问题,其中Sip是关键,JsonNode是完整节点。这似乎不是一种更干净的方式。有其他方法可以实现吗?我用的是fasterxml.jackson.databind.JsonNode

Map<String, JsonNode> map =
jsonNodeList.stream()
.collect(
toMap(
jsonNode -> jsonNode.get("sip").asText(),
jsonNode -> jsonNode,
(jsonNode1, jsonNode2) -> {
boolean after =
LocalDateTime.parse(String.valueOf(jsonNode1.get("lastModifiedDate")))
.isAfter(
LocalDateTime.parse(
String.valueOf(jsonNode2.get("lastModifiedDate"))));
return after ? jsonNode1 : jsonNode2;
},
HashMap::new));

https://github.com/octomix/josson

反序列化

Josson josson = Josson.fromJsonString(
"[" +
" {" +
"   "coupon": "VAR"," +
"   "currency": "USD"," +
"   "sip": "94989WAX5"," +
"   "lastModifiedDate": "2022-09-23T08:16:25Z"" +
"  }," +
"  {" +
"   "coupon": "VAR1"," +
"   "currency": "USD"," +
"   "sip": "94989WAX5"," +
"   "lastModifiedDate": "2022-09-21T08:16:25Z"" +
"  }," +
"  {" +
"   "coupon": "VAR3"," +
"   "currency": "USD"," +
"   "sip": "XHBRYWEB1"," +
"   "lastModifiedDate": "2022-09-20T08:16:25Z"" +
"  }" +
" ]");

转换

JsonNode node = josson.getNode("group(sip)@.elements.findByMax(lastModifiedDate)");
System.out.println(node.toPrettyString());

输出

[ {
"coupon" : "VAR",
"currency" : "USD",
"sip" : "94989WAX5",
"lastModifiedDate" : "2022-09-23T08:16:25Z"
}, {
"coupon" : "VAR3",
"currency" : "USD",
"sip" : "XHBRYWEB1",
"lastModifiedDate" : "2022-09-20T08:16:25Z"
} ]

相关内容

最新更新