本文介紹了將Avro二進制字符串轉換為Json的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個Avro二進制格式的字符串。我想將字符串轉換為json。有誰能給我帶路嗎?我嘗試使用在線提供的解決方案,但不起作用。
public String avroToJson(byte[] avro) throws IOException {
boolean pretty = false;
GenericDatumReader<GenericRecord> reader = null;
JsonEncoder encoder = null;
ByteArrayOutputStream output = null;
try {
reader = new GenericDatumReader<GenericRecord>();
InputStream input = new ByteArrayInputStream(avro);
DataFileStream<GenericRecord> streamReader = new DataFileStream<GenericRecord>(input, reader);
output = new ByteArrayOutputStream();
Schema schema = streamReader.getSchema();
DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema);
encoder = EncoderFactory.get().jsonEncoder(schema, output, pretty);
for (GenericRecord datum : streamReader) {
writer.write(datum, encoder);
}
encoder.flush();
output.flush();
return new String(output.toByteArray());
} finally {
try {
if (output != null) output.close();
} catch (Exception e) {
}
}
}
我使用getBytes()將我的字符串轉換為字節數組,并將其傳遞給此函數。我得到了這個例外。
線程”main”org.apache.avro.InvalidAvroMagicException中出現異常:不是Avro數據文件。
推薦答案
avro指定了一種二進制格式來序列化一個對象,但也指定了一個Object Container File(也稱為數據文件),它可以以一種有用的方式保存許多對象以便于文件訪問。
DataFileStream
需要容器文件,但從您的描述看,您似乎只有一個序列化的實例。
您可能需要如下內容:
public String avroToJson(Schema schema, byte[] avroBinary) throws IOException {
// byte to datum
DatumReader<Object> datumReader = new GenericDatumReader<>(schema);
Decoder decoder = DecoderFactory.get().binaryDecoder(avroBinary, null);
Object avroDatum = datumReader.read(null, decoder);
// datum to json
String json = null;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
DatumWriter<Object> writer = new GenericDatumWriter<>(schema);
JsonEncoder encoder = EncoderFactory.get().jsonEncoder(schema, baos, false);
writer.write(avroDatum, encoder);
encoder.flush();
baos.flush();
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
}
}
請注意,這意味著您必須事先知道架構才能反序列化二進制數據。如果是Avro數據文件,則可以從文件元數據中獲取架構。
這篇關于將Avro二進制字符串轉換為Json的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,