我有一个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"
} ]