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

基于Avro Schema验证JSON消息,如何获取所有校验错误?

解决Avro JSON验证收集所有错误的问题

Avro默认的GenericDatumReader遇到第一个校验错误就会抛出异常终止,要收集所有错误,你可以通过配置ValidationAction.COLLECT让reader收集所有校验问题,而非立即终止。修改后的代码如下:

import org.apache.avro.ValidationAction;
import org.apache.avro.ValidationException;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.io.Decoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.Schema;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.util.List;

public static boolean validateJson(String json, Schema schema) throws Exception {
    InputStream input = new ByteArrayInputStream(json.getBytes());
    DataInputStream din = new DataInputStream(input);

    try {
        // 创建支持收集所有错误的DatumReader
        GenericDatumReader<?> reader = new GenericDatumReader<>(schema)
                .withValidationAction(ValidationAction.COLLECT);
        Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);
        
        reader.read(null, decoder);
        
        // 获取所有收集到的校验错误
        List<ValidationException> validationErrors = reader.getValidationErrors();
        if (!validationErrors.isEmpty()) {
            System.out.println("所有校验错误:");
            for (ValidationException error : validationErrors) {
                System.out.println("- " + error.getMessage());
            }
            return false;
        }
        return true;
    } catch (Exception e) {
        // 处理非校验类的异常(比如IO错误)
        System.out.println("验证过程中出现异常:" + e.getMessage());
        return false;
    }
}

关键改动说明:

  • 用withValidationAction(ValidationAction.COLLECT)配置reader,使其收集所有校验错误而非立即抛出异常。
  • 调用reader.getValidationErrors()获取全部错误列表,可遍历输出或做其他后续处理。
  • 调整捕获范围为通用Exception,区分校验错误与IO类等其他异常。

注意:该方案要求Avro版本1.9.0及以上,若使用旧版本需先升级依赖。

内容的提问来源于stack exchange,提问作者Rishabh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:18:13