Java 如何使用不同的模式验证Avro格式的数据

Java 如何使用不同的模式验证Avro格式的数据,java,avro,avro-tools,Java,Avro,Avro Tools,1) 如果我们要用schema1验证上面的json,它应该是true 2) 如果我们要用schema2验证上面的json,它应该说false,因为根据schema,“age”字段是int,但在json中是string private static final String json = "{" + "\"name\":\"Frank\"," + "\"age\":\"47\"" + "}"; private static final Schema schema1 = new Schema.Par

1) 如果我们要用schema1验证上面的json,它应该是true

2) 如果我们要用schema2验证上面的json,它应该说false,因为根据schema,“age”字段是int,但在json中是string

private static final String json = "{" + "\"name\":\"Frank\"," + "\"age\":\"47\"" + "}";
private static final Schema schema1 = new Schema.Parser().parse("{ \"type\":\"record\", \"namespace\":\"foo\", \"name\":\"Person\", \"fields\":[ { \"name\":\"name\", \"type\":\"string\" }, { \"name\":\"age\", \"type\":\"string\" } ] }");
private static final Schema schema2 = new Schema.Parser().setValidate(true).parse("{ \"type\":\"record\", \"namespace\":\"foo\", \"name\":\"Person\", \"fields\":[ { \"name\":\"name\", \"type\":\"string\" }, { \"name\":\"age\", \"type\":\"int\" } ] }");
公共静态布尔validateJson(字节[]数据,架构)引发异常{
InputStream输入=新的ByteArrayInputStream(数据);
DataInputStream din=新的DataInputStream(输入);
GenericDatumReader=null;
对象基准=空;
二进制解码器二进制解码器=
DecoderFactory.get().binaryDecoder(输入,null);
试一试{
reader=新的GenericDatumReader(模式);
DatumWriter=新的GenericDatumWriter(模式);
Decoder Decoder=DecoderFactory.get().binaryDecoder(输入,null);
读取(din,解码器);
返回true;
}捕获(AVROTYPE异常){
System.out.println(e.getMessage());
返回false;
}
}
公共静态字节[]JSONTAVRO(字符串json,模式模式)引发IOException{
DatumReader=新的GenericDatumReader(模式);
GenericDatumWriter=新的GenericDatumWriter(模式);
ByteArrayOutputStream输出=新建ByteArrayOutputStream();
Decoder Decoder=DecoderFactory.get().jsonDecoder(模式,json);
编码器编码器=EncoderFactory.get().binaryEncoder(输出,null);
对象数据=reader.read(空,解码器);
写入(数据、编码器);
encoder.flush();
返回output.toByteArray();
}

和?2美元能买到什么?你使用Avro 1.8 libs吗?谢谢Harold,总是正确的。当我打印json数据(json和schema2)时,得到的年龄值是2作为int,但当我打印数据(json和schema1)时,年龄值是47作为stringusing Avro 1.8.2 lib无法重现我的Avro编码器的问题。我得到了
AvroTypeException,应为int。得到了值\u字符串
。尝试将Schema2的记录类型更改为“Person2”。你能分享你的代码快照吗。。
public static boolean validateJson(byte[] data, Schema schema) throws Exception {
    InputStream input = new ByteArrayInputStream(data);
    DataInputStream din = new DataInputStream(input);
    GenericDatumReader<Object> reader = null;
    Object datum = null;
    BinaryDecoder binaryDecoder =
            DecoderFactory.get().binaryDecoder(input, null);
    try {
        reader = new GenericDatumReader<Object>(schema);
        DatumWriter<Object> writer = new GenericDatumWriter<Object>(schema);
        Decoder decoder = DecoderFactory.get().binaryDecoder(input, null);
        reader.read(din, decoder);
        return true;
    } catch (AvroTypeException e) {
        System.out.println(e.getMessage());
        return false;
    }
}

public static byte[] jsonToAvro(String json, Schema schema) throws IOException {
    DatumReader<Object> reader = new GenericDatumReader<>(schema);
    GenericDatumWriter<Object> writer = new GenericDatumWriter<>(schema);
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    Decoder decoder = DecoderFactory.get().jsonDecoder(schema, json);
    Encoder encoder = EncoderFactory.get().binaryEncoder(output, null);
    Object datum = reader.read(null, decoder);
    writer.write(datum, encoder);
    encoder.flush();
    return output.toByteArray();
}