实际上,我的问题类似于下面的链接中显示的答案(其中显示了使用avsc javascript库进行序列化/去序列化),但我需要一个解决方案来序列化到avro,并使用apache avro for java对其进行反序列化……
Json数组的Avro架构
https://avro.apache.org/docs/current/gettingstartedjava.html
数据
[
{"id":1,"text":"some text","user_id":1},
{"id":1,"text":"some text","user_id":2},
...
]模式
{
"name": "Name",
"type": "array",
"namespace": "com.hi.avro.model",
"items": {
"name": "NameDetails",
"type": "record",
"fields": [
{
"name": "id",
"type": "int"
},
{
"name": "text",
"type": "string"
},
{
"name": "user_id",
"type": "int"
}
]
}
}感谢任何帮助..。
发布于 2021-03-01 16:42:12
我已经开始阅读API,并在我的代码上试用它……
当我创建了这篇文章时,我努力地将它分配给GenericRecord,但这是不起作用的。所以我发布了这个问题,因为我不清楚它。
最后,我没有将整个数组赋给GenericRecord,而是继续使用GenericArray并向其添加GenericRecord
下面是代码片段
//到json
GenericArray record = new GenericDatumReader(schema).read(null, binaryDecoder);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
NoWrappingJsonEncoder jsonEncoder = new NoWrappingJsonEncoder(record.getSchema(), outputStream);
DatumWriter writer = record instanceof SpecificRecord ?
new SpecificDatumWriter<>(record.getSchema()) :
new GenericDatumWriter<>(record.getSchema());
writer.write(record, jsonEncoder);
jsonEncoder.flush();
byte[] result = outputStream.toByteArray();//到avro
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(outputStream, null);
GenericDatumWriter writer = new GenericDatumWriter(schema, genericData);
byte[] data;
List list = mapper.readValue(data, List.class);
GenericRecordBuilder record = new GenericRecordBuilder(schema.getElementType());
List array = new ArrayList<>();
json.forEach(entry -> {
//logic for reading GenericRecord for each of the list should be done here
...
array.add(genericRecord);
});
writer.write(array, encoder);
encoder.flush();
byte[] result = outputStream.toByteArray();https://stackoverflow.com/questions/66382917
复制相似问题