如何依据Avro Schema将数据对象序列化为JSON字符串?
Avro对象按Schema序列化为JSON字符串的实现方法
当然可以实现,Avro本身提供了原生的JSON序列化工具,以下是具体实现方案:
1. 引入Avro依赖
如果使用Maven,在pom.xml中添加依赖(使用最新稳定版本即可):
<dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.11.3</version> </dependency>
2. 序列化GenericRecord为JSON
若数据对象是手动构造的GenericRecord,可通过GenericDatumWriter和JsonEncoder完成序列化:
import org.apache.avro.Schema; import org.apache.avro.generic.GenericRecord; import org.apache.avro.io.DatumWriter; import org.apache.avro.io.JsonEncoder; import org.apache.avro.specific.SpecificDatumWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; public class AvroJsonSerializer { public static String serializeGenericToJson(GenericRecord record, Schema schema) throws IOException { DatumWriter<GenericRecord> datumWriter = new SpecificDatumWriter<>(schema); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); JsonEncoder encoder = new JsonEncoder(schema, outputStream); datumWriter.write(record, encoder); encoder.flush(); return outputStream.toString("UTF-8"); } }
3. 序列化SpecificRecord为JSON
若数据对象是Avro工具生成的SpecificRecord子类(从Schema编译出的Java类),代码逻辑如下:
import org.apache.avro.specific.SpecificRecord; import org.apache.avro.io.DatumWriter; import org.apache.avro.io.JsonEncoder; import org.apache.avro.specific.SpecificDatumWriter; import java.io.ByteArrayOutputStream; import java.io.IOException; public class AvroJsonSerializer { public static <T extends SpecificRecord> String serializeSpecificToJson(T record) throws IOException { DatumWriter<T> datumWriter = new SpecificDatumWriter<>(record.getSchema()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); JsonEncoder encoder = new JsonEncoder(record.getSchema(), outputStream); datumWriter.write(record, encoder); encoder.flush(); return outputStream.toString("UTF-8"); } }
关键注意事项
JsonEncoder会严格遵循Schema定义生成JSON,保证输出格式合规- 若数据与Schema不匹配(如字段缺失、类型不兼容),会抛出
IOException,需自行处理异常 - 输出的JSON会包含Schema定义的所有字段,即使字段值为null也会保留(符合Avro JSON序列化规范)
内容的提问来源于stack exchange,提问作者Arman
相关产品推荐
相关产品推荐

