Converting Avro Binary String to Json(将Avro二进制字符串转换为Json)
本文介绍了将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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:将Avro二进制字符串转换为Json
基础教程推荐
猜你喜欢
- 如何对 HashSet 进行排序? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01