当前位置: 首页 > 知识库问答 >
问题:

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

房时铭
2023-03-14

我有一个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值相同,那么我只需要选择最后修改日期是最新的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"
  }
 ]

我试图通过创建< code>HashMap来解决这个问题

共有2个答案

窦涵忍
2023-03-14

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"
} ]
苏鸿才
2023-03-14
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));
 类似资料:
  • 问题内容: 我像电话教程一样在angularJS中使用ng- repeat和filter,但我想在页面中突出显示搜索结果。使用基本的jQuery,我只需在输入的键上解析页面,但是我试图以有角度的方式进行操作。有任何想法吗 ? 我的代码: 问题答案: 对于AngularJS v1.2 + HTML: JS: CSS:

  • 问题内容: 我必须通过一个映射过滤一个对象集合,该映射包含对象字段名称和字段值的键值对。我试图通过stream()。filter()应用所有过滤器。 对象实际上是JSON,因此Map保留了其变量的名称以及它们必须包含的值才能被接受,但是出于简单性的原因,并且由于它与问题无关,因此我编写了一个简单的Testclass来模拟行为: 到目前为止我尝试过的是: 我尝试将Map的forEach放在首位,并将

  • 我必须通过一个映射过滤对象集合,该映射包含对象字段名和字段值的键值对。我正在尝试按stream()应用所有过滤器。过滤器()。 对象实际上是JSON,因此映射包含其变量的名称以及它们必须包含的值,以便被接受,但出于简单的原因,并且由于与问题无关,我编写了一个简单的Testclass来模拟行为: 到目前为止我所尝试的: 我试着将地图的每个部分放在第一位,将集合的流放在第一位,但这两种解决方案都没有按

  • 问题内容: 好的,起初这只是和我的一个朋友开玩笑,但后来变成了有趣的技术问题:) 我有下表: 该表包含我所有东西的记录,并分别具有数量和优先级(我需要多少)。 我有一个指定体积的袋子,例如。我想从表中选择所有可以放入袋子的东西,首先包装最重要的东西。 这似乎是使用窗口函数的情况,所以这是我想出的查询: 但是,问题在于Postgres抱怨: 如果我删除此过滤器,则会正确计算总列,对结果进行正确排序,

  • 我正在寻找通过以下条件过滤df的方法: 由创建的

  • 我有一个像这样的数组 所以我想过滤包含“.jpg”扩展名文件的数组,所以我用 所以我得到了我的期望值 我用地图功能代替了“家/工作/” 得到了我的价值 但问题是,我必须使用两种方法来过滤和替换它们。我是否有可能合并这两种方法并最小化代码 预期产出 使用任何链接方法?