You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:45:42