Java 如何使用Avro序列化/反序列化动态json类型

Java 如何使用Avro序列化/反序列化动态json类型,java,json,api,serialization,avro,Java,Json,Api,Serialization,Avro,在过去的一周里,我一直在尝试使用Avro映射来自流式api的数据。 我使用ReflectData从表示json响应的POJO创建模式 然后我使用ReflectDatumReader将json转换为avro字节,反之亦然 我面临的问题与我得到的json响应有关。根据发送的消息类型,响应可能会发生变化 i、 e 但这也可能是错误的 { "id": 001, "text": { "type": "status", "event": "event", "status": {

在过去的一周里,我一直在尝试使用Avro映射来自流式api的数据。 我使用
ReflectData
从表示json响应的POJO创建模式

然后我使用ReflectDatumReader将json转换为avro字节,反之亦然

我面临的问题与我得到的json响应有关。根据发送的消息类型,响应可能会发生变化

i、 e

但这也可能是错误的

{
"id": 001,
"text": {
    "type": "status",
    "event": "event",
    "status": {
    ...
}
因此,正如您所看到的,type对象反映了稍后json对象的名称。 我找不到一种表示这种模式的方法。我过去曾使用jackson来表示这样的多态类型,但我想不出用Avro的JavaAPI实现这一点的方法

我非常感谢您在这方面提供的任何帮助/建议。:)
非常感谢。

您可能必须使用Avro术语中所称的“模式投影”:也就是说,您定义了正在解析的不同模式的超集,Avro会根据需要忽略缺少的模式字段。在“模式解析”一节中对其进行了描述:


至少这是理论。在实践中,我经常不得不深入到(Java-)API代码中,明确地处理空值等问题。

hey@davek感谢您的回复。因此,如果我从他们的规范中得到了正确的答案,那么似乎不可能有一个能够管理具有多个名称的字段的编写器。我这样想对吗?即使我可以编写第一个响应,当
注释
对象更改为
状态
时,我也会得到一个错误。这是正确的:您必须定义一个包含两个字段的超集架构:然后您可以解析您正在读取的记录中的字段。
{
"id": 001,
"text": {
    "type": "status",
    "event": "event",
    "status": {
    ...
}