繁体   English   中英

将 Avro 二进制字符串转换为 Json

[英]Converting Avro Binary String to 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() 将我的字符串转换为字节数组并将其传递给此 function。我收到此异常。 线程“main”中的异常 org.apache.avro.InvalidAvroMagicException:不是 Avro 数据文件。

Avro 指定了一种二进制格式,用于序列化一个 object,以及一个Object 容器文件(也称为数据文件),它可以以一种有用的方式保存许多对象以进行文件访问。

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 数据文件,您可以从文件元数据中获取架构。

在这一行: Object avroDatum = datumReader.read(null, decoder);

我收到异常:org.apache.avro.AvroRuntimeException:格式错误的数据。 长度为负:-1

有没有人成功地将 AVRO 二进制转换为 JSON > 请分享。

使用 generics:

public <T extends SpecificRecordBase> String convertAvroToJson(T payload) throws Exception {

    DatumWriter<T> writer = new SpecificDatumWriter<T>(payload.getSchema());
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    byte[] payloadJsonBytes;

    try{

        Encoder jsonEncoder = EncoderFactory.get().jsonEncoder(payload.getSchema(), stream);
        writer.write(payload, jsonEncoder);
        jsonEncoder.flush();
        payloadJsonBytes = stream.toByteArray();

    } catch (IOException e) {
        throw new Exception("Cannot convert avro to JSON! ", e);
    }

    String payloadJson = new String(payloadJsonBytes, StandardCharsets.UTF_8);

    return payloadJson;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM