使用Groovy统计JSON数组中success与error对象的数量
用Jackson统计JSON中results数组的success/error数量
方法一:使用JsonNode(无需定义实体类)
这种方式无需提前创建对应的Java实体类,适合仅需统计字段类型的场景:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonResultStats { public static void main(String[] args) throws Exception { // 替换为你的API响应JSON字符串或输入流 String apiJsonResponse = "{...}"; ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(apiJsonResponse); // 定位到results数组节点 JsonNode resultsArray = rootNode.path("details").path("results"); int errorCount = 0; int successCount = 0; // 遍历数组统计数量 for (JsonNode resultItem : resultsArray) { // 每个resultItem仅包含一个键:error或success String itemType = resultItem.fieldNames().next(); if ("error".equals(itemType)) { errorCount++; } else if ("success".equals(itemType)) { successCount++; } } // 输出统计结果 System.out.println("Errors=" + errorCount); System.out.println("Successes=" + successCount); // 打印所有对象名称 System.out.println("\n所有对象类型:"); for (JsonNode resultItem : resultsArray) { System.out.println(resultItem.fieldNames().next()); } } }
方法二:使用实体类绑定(适合需处理详细数据的场景)
如果后续需要操作error或success内的具体数据,可以先定义对应实体类,再统计:
import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; // 定义对应实体类 class ApiResponse { private Details details; // 生成getter、setter public Details getDetails() { return details; } public void setDetails(Details details) { this.details = details; } } class Details { private List<Result> results; // 生成getter、setter public List<Result> getResults() { return results; } public void setResults(List<Result> results) { this.results = results; } } class Result { private Error error; private List<SuccessItem> success; // 生成getter、setter public Error getError() { return error; } public void setError(Error error) { this.error = error; } public List<SuccessItem> getSuccess() { return success; } public void setSuccess(List<SuccessItem> success) { this.success = success; } } // 按需定义Error和SuccessItem类的字段及getter/setter class Error { private String errorCode; private String message; // ... 其他字段及getter/setter } class SuccessItem { private Region region; private Driver driver; // ... 其他字段及getter/setter } class Region { private String qualifier; /* getter/setter */ } class Driver { private String qualifier; /* getter/setter */ } // 统计代码 public class EntityBasedStats { public static void main(String[] args) throws Exception { String apiJsonResponse = "{...}"; ObjectMapper mapper = new ObjectMapper(); ApiResponse response = mapper.readValue(apiJsonResponse, ApiResponse.class); int errorCount = 0; int successCount = 0; for (Result result : response.getDetails().getResults()) { if (result.getError() != null) { errorCount++; } if (result.getSuccess() != null && !result.getSuccess().isEmpty()) { successCount++; } } System.out.println("Errors=" + errorCount); System.out.println("Successes=" + successCount); } }
说明
- 方法一中的
path()方法会在节点不存在时返回空节点,避免抛出异常,比get()更安全。 - 每个
results数组元素仅包含error或success一个键,因此可以直接通过fieldNames().next()获取类型名称。
内容的提问来源于stack exchange,提问作者sandsawks
相关产品推荐
相关产品推荐

