java - 如何根据 JsonArray 中的键值过滤列表

标签 java arrays json lambda collections

如何根据 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<String> eventDataSetList 组成

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

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

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);
        }
    }
}

最佳答案

您可以使用 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")) 匹配的所有事件。 。最后它们被收集到 map 中。

关于java - 如何根据 JsonArray 中的键值过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55654584/

相关文章:

java - 改造无法将新 token 设置为请求 header

java - 为什么当我缩放多边形时我的光强度会改变?

java - 如何在 JSP 中导入类?

java - 在创建之前查找有多少 RecyclerView 项目适合屏幕

javascript - 通过代码从数组创建 Json 结构 - Typescript

javascript - 如何从另一个文件调用数组的属性

android - 谷歌地方 API : Are "place_id" or "id" unique to any city in the world?

javascript - 如何通过其中的一个键将一个深度json转换为多个深度?

javascript - d3.js 应用颜色范围不适用于 JSON

javascript - Node - 在 For 周期内等待请求响应