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\" } ] }");
1)if we going to validate above json with schema1 it should say true
2)if we going to validate above json with schema2 it should say false due to "age" field is int according to schema, but in json it is string
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();
}