如何将java POJO编码为json,使其与avro兼容?
我需要将一个对象序列化为Json,但格式应该与avro兼容 我的意思是,如果对象有一个可选字段,那么它应该写为如何将java POJO编码为json,使其与avro兼容?,java,avro,Java,Avro,我需要将一个对象序列化为Json,但格式应该与avro兼容 我的意思是,如果对象有一个可选字段,那么它应该写为“fieldName”:{“fieldType”:“fieldValue”} ApacheAvro中有任何类可以做到这一点吗 我的avro模式如下所示: { "type": "record", "name": "TrialAssignments", "namespace": &
“fieldName”:{“fieldType”:“fieldValue”}
ApacheAvro中有任何类可以做到这一点吗
我的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编码。请尝试检查此资源
私有静态GenericRecord pojoToRecord(T型)引发IOException{
Schema Schema=ReflectData.get().getSchema(model.getClass());
ReflectDatumWriter datumWriter=新的ReflectDatumWriter(模式);
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
BinaryEncoder编码器=EncoderFactory.get().BinaryEncoder(outputStream,null);
datumWriter.write(型号、编码器);
encoder.flush();
DatumReader DatumReader=新的GenericDatumReader(模式);
BinaryDecoder decoder=DecoderFactory.get().BinaryDecoder(outputStream.toByteArray(),null);
返回datumReader.read(空,解码器);
}
尝试检查此资源
私有静态GenericRecord pojoToRecord(T型)引发IOException{
Schema Schema=ReflectData.get().getSchema(model.getClass());
ReflectDatumWriter datumWriter=新的ReflectDatumWriter(模式);
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
BinaryEncoder编码器=EncoderFactory.get().BinaryEncoder(outputStream,null);
datumWriter.write(型号、编码器);
encoder.flush();
DatumReader DatumReader=新的GenericDatumReader(模式);
BinaryDecoder decoder=DecoderFactory.get().BinaryDecoder(outputStream.toByteArray(),null);
返回datumReader.read(空,解码器);
}
您尝试过Apache AVRO吗?是的,我正在尝试Apache AVRO。这与将java对象转换为avro无关。这个问题是关于为从avro模式生成的java pojo生成Json表示,以便它能够成功地转换为avro。您尝试过Apache avro吗?是的,我正在尝试Apache avro。这与将java对象转换为avro无关。这个问题是关于为从avro模式生成的java pojo生成Json表示,以便它能够成功地转换为avro。我不确定这是否是我所需要的。我需要的是将Pojo或SpecificRecord转换为与avro兼容的json,这样它就可以毫无错误地转换回avro。我不确定这是否是我需要的。我需要的是将Pojo或SpecificRecord转换为与avro兼容的json,以便它能够无错误地转换回avro。
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);
}