如何将java POJO编码为json,使其与avro兼容?

如何将java POJO编码为json,使其与avro兼容?,java,avro,Java,Avro,我需要将一个对象序列化为Json,但格式应该与avro兼容 我的意思是,如果对象有一个可选字段,那么它应该写为“fieldName”:{“fieldType”:“fieldValue”} ApacheAvro中有任何类可以做到这一点吗 我的avro模式如下所示: { "type": "record", "name": "TrialAssignments", "namespace": &

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

我的意思是,如果对象有一个可选字段,那么它应该写为
“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);
    }