如何从嵌套JSON文件中按Status提取测试用例名称?
从嵌套JSON中按Status提取测试用例名称(Java Gson实现)
问题背景
给定如下嵌套结构的JSON测试结果文件:
{ "TagName1":{ "TestCaseName1":{ "Status":"pass", "RunTime":"063045" }, "TestCaseName2":{ "Status":"fail", "RunTime":"064045" } }, "TagName2":{ "TestCaseName3":{ "Status":"pass", "RunTime":"073045" }, "TestCaseName4":{ "Status":"fail", "RunTime":"074045" } } }
需要根据Status字段值,提取对应的测试用例名称。
解决方案1:基于嵌套HashMap的遍历
你已经用Gson将JSON解析为嵌套HashMap,接下来只需通过多层遍历,提取每个测试用例的Status并匹配目标值,收集对应的测试用例名称即可。注意修正代码中的笔误(newBufferReader改为newBufferedReader),并通过TypeToken明确泛型类型避免警告:
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TestResultParser { public static void main(String[] args) { String filePath = "你的JSON文件路径"; try { Gson gson = new Gson(); Reader reader = Files.newBufferedReader(Paths.get(filePath)); // 用TypeToken指定嵌套HashMap的泛型类型 HashMap<String, HashMap<String, HashMap<String, String>>> parsedJson = gson.fromJson( reader, new TypeToken<HashMap<String, HashMap<String, HashMap<String, String>>>>() {}.getType() ); // 定义要筛选的目标Status String targetStatus = "fail"; List<String> targetTestCases = new ArrayList<>(); // 遍历外层标签 for (Map.Entry<String, HashMap<String, HashMap<String, String>>> tagEntry : parsedJson.entrySet()) { HashMap<String, HashMap<String, String>> testCases = tagEntry.getValue(); // 遍历标签下的所有测试用例 for (Map.Entry<String, HashMap<String, String>> testCaseEntry : testCases.entrySet()) { String testCaseName = testCaseEntry.getKey(); String status = testCaseEntry.getValue().get("Status"); // 匹配目标Status则收集名称 if (targetStatus.equals(status)) { targetTestCases.add(testCaseName); } } } // 输出结果 System.out.println("状态为[" + targetStatus + "]的测试用例:"); targetTestCases.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } } }
解决方案2:基于POJO的类型安全解析
嵌套HashMap可读性差且容易出现类型错误,推荐定义对应JSON结构的POJO类,实现类型安全的解析,代码更易维护:
步骤1:定义POJO类
// 测试用例详情类,对应JSON中的测试用例节点 class TestCaseDetail { private String Status; private String RunTime; // Getter方法 public String getStatus() { return Status; } public String getRunTime() { return RunTime; } }
步骤2:解析并筛选测试用例
import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; public class TestResultParser { public static void main(String[] args) { String filePath = "你的JSON文件路径"; try { Gson gson = new Gson(); Reader reader = Files.newBufferedReader(Paths.get(filePath)); // 解析为Map<String, Map<String, TestCaseDetail>>,外层key是TagName,内层key是TestCaseName Map<String, Map<String, TestCaseDetail>> testResultMap = gson.fromJson( reader, new TypeToken<Map<String, Map<String, TestCaseDetail>>>() {}.getType() ); String targetStatus = "pass"; List<String> targetTestCases = new ArrayList<>(); for (Map.Entry<String, Map<String, TestCaseDetail>> tagEntry : testResultMap.entrySet()) { Map<String, TestCaseDetail> testCases = tagEntry.getValue(); for (Map.Entry<String, TestCaseDetail> testCaseEntry : testCases.entrySet()) { String testCaseName = testCaseEntry.getKey(); TestCaseDetail detail = testCaseEntry.getValue(); if (targetStatus.equals(detail.getStatus())) { targetTestCases.add(testCaseName); } } } System.out.println("状态为[" + targetStatus + "]的测试用例:"); targetTestCases.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Akshay Katiha
相关产品推荐
相关产品推荐

