过去一周我一直在尝试使用 Avro 来映射来自流 api 的数据。
我使用 ReflectData
从表示 json 响应的 POJO 创建架构。
然后,我使用 ReflectDatumReader 将 json 转换为 avro 字节,反之亦然。
我面临的问题与我收到的 json 响应有关。响应可能会根据发送的消息类型而变化。
即
{
"id": 001,
"text": {
"type": "comment",
"event": "event",
"comment": {
...
}
但这也可以
{
"id": 001,
"text": {
"type": "status",
"event": "event",
"status": {
...
}
所以,正如您所看到的,类型对象反射(reflect)了稍后 json 对象的名称。 我找不到一种方法来表示这样的模式。我过去曾使用 jackson 来表示这样的多态类型,但我无法找到使用 Avro 的 Java API 来实现此目的的方法。
我非常感谢对此的任何帮助/建议。 :) 非常感谢。
最佳答案
您可能必须使用 Avro 术语中所谓的“架构投影”:也就是说,您定义正在解析的不同架构的超集,并且 Avro 会根据需要忽略缺少的架构字段。它在架构解析部分进行了描述:
http://avro.apache.org/docs/1.7.7/spec.html
至少这是理论上的。在实践中,我经常不得不深入研究(Java-)API 代码并显式处理 null 等。
关于java - 如何使用 Avro 序列化/反序列化动态 json 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26656140/