问题描述
我需要将一个对象序列化为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.gson
或Jackson
之类的通用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);
}