Bayt dizisine avro ikili kodlaması yapmam gereken gerçek bir JSON String'im var. Apache Avro specification'u geçtikten sonra, aşağıdaki kodla geldim.Jro dizgimi bir bayt dizisine ikili kodlama nasıl yapılır?
Bunun doğru yol olup olmadığı konusunda emin değilim. JSON String'imi kodlamak için avro ikili kodlamaya çalışmamın doğru olup olmadığını bir bakabilir miyim? Apache Avro 1.7.7 sürümünü kullanıyorum.
public class AvroTest {
private static final String json = "{" + "\"name\":\"Frank\"," + "\"age\":47" + "}";
private static final String schema = "{ \"type\":\"record\", \"namespace\":\"foo\", \"name\":\"Person\", \"fields\":[ { \"name\":\"name\", \"type\":\"string\" }, { \"name\":\"age\", \"type\":\"int\" } ] }";
public static void main(String[] args) throws IOException {
byte[] data = jsonToAvro(json, schema);
String jsonString = avroToJson(data, schema);
System.out.println(jsonString);
}
/**
* Convert JSON to avro binary array.
*
* @param json
* @param schemaStr
* @return
* @throws IOException
*/
public static byte[] jsonToAvro(String json, String schemaStr) throws IOException {
InputStream input = null;
GenericDatumWriter<Object> writer = null;
Encoder encoder = null;
ByteArrayOutputStream output = null;
try {
Schema schema = new Schema.Parser().parse(schemaStr);
DatumReader<Object> reader = new GenericDatumReader<Object>(schema);
input = new ByteArrayInputStream(json.getBytes());
output = new ByteArrayOutputStream();
DataInputStream din = new DataInputStream(input);
writer = new GenericDatumWriter<Object>(schema);
Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);
encoder = EncoderFactory.get().binaryEncoder(output, null);
Object datum;
while (true) {
try {
datum = reader.read(null, decoder);
} catch (EOFException eofe) {
break;
}
writer.write(datum, encoder);
}
encoder.flush();
return output.toByteArray();
} finally {
try {
input.close();
} catch (Exception e) {
}
}
}
/**
* Convert Avro binary byte array back to JSON String.
*
* @param avro
* @param schemaStr
* @return
* @throws IOException
*/
public static String avroToJson(byte[] avro, String schemaStr) throws IOException {
boolean pretty = false;
GenericDatumReader<Object> reader = null;
JsonEncoder encoder = null;
ByteArrayOutputStream output = null;
try {
Schema schema = new Schema.Parser().parse(schemaStr);
reader = new GenericDatumReader<Object>(schema);
InputStream input = new ByteArrayInputStream(avro);
output = new ByteArrayOutputStream();
DatumWriter<Object> writer = new GenericDatumWriter<Object>(schema);
encoder = EncoderFactory.get().jsonEncoder(schema, output, pretty);
Decoder decoder = DecoderFactory.get().binaryDecoder(input, null);
Object datum;
while (true) {
try {
datum = reader.read(null, decoder);
} catch (EOFException eofe) {
break;
}
writer.write(datum, encoder);
}
encoder.flush();
output.flush();
return new String(output.toByteArray());
} finally {
}
}
}