如何将Java POJO编码为json,以便与avro兼容?

问题描述

我需要将一个对象序列化为Json,但格式应与avro兼容。

我的意思是,如果对象具有可选字段,则应将其写为"fieldName": { "fieldType": "fieldValue" }

apache avro中是否有可以做到这一点的课程?

我的Avro模式如下:

{
  "type": "record","name": "TrialAssignments","namespace": "com.ferozed.experimentation","fields": [
    {
      "name": "key","type": [
        "null","string"
      ],"doc": "key used to generate trial/treatments *","default": null
    }
   ]
}

有效的与Avro兼容的json表示为:

{
   "key": { "string": "value" }
}

但是,如果我使用com.google.gsonJackson之类的通用Json编码器,则会产生:

{
    "key": "value"
}

这不是该模式的正确avro编码。

解决方法

尝试检查此资源https://karengryg.io/2018/08/25/avro-and-pojo-conversionstips-for-kafka-devs/

private static <T> GenericRecord pojoToRecord(T model) throws IOException {
        Schema schema = ReflectData.get().getSchema(model.getClass());

        ReflectDatumWriter<T> datumWriter = new ReflectDatumWriter<>(schema);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(outputStream,null);
        datumWriter.write(model,encoder);
        encoder.flush();

        DatumReader<GenericRecord> datumReader = new GenericDatumReader<>(schema);
        BinaryDecoder decoder = DecoderFactory.get().binaryDecoder(outputStream.toByteArray(),null);

        return datumReader.read(null,decoder);
    }