【问题标题】:How to filter the list based on the value of a key from JsonArray如何根据 JsonArray 中的键值过滤列表
【发布时间】:2019-09-03 09:26:26
【问题描述】:

如何根据JSONArray 的值过滤列表?

JSONArray 的元素是简单的 json 结构,带有键和值。

JSONArray 来自包 org.json 并使用此依赖项

             <dependency>
               <groupId>org.json</groupId>
               <artifactId>json</artifactId>
               <version>20180130</version>
            </dependency>

我到达端点时得到的字符串响应就是这样解析的

   String response = [{"ID": 1,"updatedAt": "2019-04-12T09:09:48"},{"ID": 2,"updatedAt": "2019-04-12T09:09:48"}      
   JSONArray jsonArray =  new JSONArray(response)

我要过滤的列表包含 json 字符串列表List&lt;String&gt; eventDataSetList

现在我如何使用来自 jsonArray 的键 ID 的值以比这更好的方式过滤列表?

这是我到目前为止所做的,但我真的不想使用嵌套循环:

Map<Object, String> filteredEvents = new HashMap<>();
for (String event : eventDataSetList) {
    for (Object obj : jsonArray) {
        JSONObject jsonObject = (JSONObject) obj;
        if (event.contains(jsonObject.getString("ID"))) {
            filteredEvents.put(jsonObject, event);
        }
    }
}

【问题讨论】:

  • jsonArray 是什么类型?是数组还是列表?
  • @samuel Phillipp 它是一个数组。很抱歉错过了

标签: java arrays json lambda collections


【解决方案1】:

您可以通过以下方式使用 Java Stream API:

Map<JSONObject, String> filteredEvents = StreamSupport.stream(jsonArray.spliterator(), false).map(o -> (JSONObject) o)
        .flatMap(o -> eventDataSetList.stream().filter(e -> e.contains(o.getString("ID"))).map(e -> new AbstractMap.SimpleEntry<>(o, e)))
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

这将创建一个 Stream,它会遍历 JSON 数组中的所有元素并查找与条件 event.contains(jsonObject.getString("ID")) 匹配的所有事件。最后将它们收集到地图中。

【讨论】:

  • Arrays.stream(jsonArray) 不起作用。 jsonArray 无法流式传输。除此之外感谢您的帮助
  • 可以分享jsonArray的类型吗?请将其添加到您的问题中。
  • 在问题中添加了更多详细信息。谢谢!
  • 我更新了我的答案,但您可能应该使用o.get("ID").toString() 而不是o.getString("ID"),因为这会为您共享的字符串抛出org.json.JSONException: JSONObject["ID"] not a string.
猜你喜欢
  • 2021-11-25
  • 2020-02-06
  • 2015-05-17
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
相关资源
最近更新 更多