Java 如何使用不同的模式验证Avro格式的数据
1) 如果我们要用schema1验证上面的json,它应该是true 2) 如果我们要用schema2验证上面的json,它应该说false,因为根据schema,“age”字段是int,但在json中是stringJava 如何使用不同的模式验证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
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();
}