如何过滤含JSON字符串的List<String>并按class字段分组生成新列表
实现方案(Java 场景)
最简便的方式是结合 Java Stream API 和常用JSON解析库(如Jackson/Gson)完成分组,步骤如下:
1. 依赖准备
若使用Jackson,添加Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
若使用Gson,添加Maven依赖:
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency>
2. Jackson 实现代码
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class JsonGroupDemo { public static void main(String[] args) { List<String> jsonList = List.of( "{\"name\":\"Alex\",\"age\":\"31\",\"class\":\"Biology\",\"parents\":{\"father\":\"Robert\",\"mother\":\"Mary\"}}", "{\"name\":\"John\",\"age\":\"34\",\"class\":\"Mathematics\",\"parents\":{\"father\":\"Remi\",\"mother\":\"Maya\"}}", "{\"name\":\"Rita\",\"age\":\"27\",\"class\":\"History\",\"parents\":{\"father\":\"Shankar\",\"mother\":\"Anita\"}}", "{\"name\":\"Sonia\",\"age\":\"27\",\"class\":\"Biology\",\"parents\":{\"father\":\"Mathew\",\"mother\":\"Lucy\"}}", "{\"name\":\"Caroline\",\"age\":\"29\",\"class\":\"Mathematics\",\"parents\":{\"father\":\"David\",\"mother\":\"Christine\"}}" ); ObjectMapper mapper = new ObjectMapper(); // 按class字段分组,得到键为班级名、值为对应JSON字符串列表的Map Map<String, List<String>> groupedMap = jsonList.stream() .collect(Collectors.groupingBy(jsonStr -> { try { JsonNode node = mapper.readTree(jsonStr); return node.get("class").asText(); } catch (Exception e) { throw new RuntimeException("JSON解析失败", e); } })); // 按需提取分组结果,例如获取Biology分组 List<String> biologyList = groupedMap.get("Biology"); // 输出验证 biologyList.forEach(System.out::println); } }
3. Gson 核心替换逻辑
如果用Gson,只需修改分组时的JSON解析部分:
import com.google.gson.JsonObject; import com.google.gson.JsonParser; // 替换groupingBy中的Lambda表达式 Collectors.groupingBy(jsonStr -> { JsonObject obj = JsonParser.parseString(jsonStr).getAsJsonObject(); return obj.get("class").getAsString(); })
实现方案(Python 场景)
Python 中可借助json模块和itertools.groupby快速完成:
import json from itertools import groupby json_list = [ '{"name":"Alex","age":"31","class":"Biology","parents":{"father":"Robert","mother":"Mary"}}', '{"name":"John","age":"34","class":"Mathematics","parents":{"father":"Remi","mother":"Maya"}}', '{"name":"Rita","age":"27","class":"History","parents":{"father":"Shankar","mother":"Anita"}}', '{"name":"Sonia","age":"27","class":"Biology","parents":{"father":"Mathew","mother":"Lucy"}}', '{"name":"Caroline","age":"29","class":"Mathematics","parents":{"father":"David","mother":"Christine"}}' ] # 先解析所有JSON并按class字段排序(groupby要求先排序) parsed_list = sorted([json.loads(s) for s in json_list], key=lambda x: x['class']) # 分组并转回JSON字符串 grouped_result = {key: [json.dumps(item) for item in group] for key, group in groupby(parsed_list, key=lambda x: x['class'])} # 示例:获取Mathematics分组 math_list = grouped_result["Mathematics"] for item in math_list: print(item)
内容的提问来源于stack exchange,提问作者Saddam Hussain I H
相关产品推荐
相关产品推荐

