使用Avro嵌套的特定类型反序列化

ral*_*aul 4 java serialization avro deserialization apache-kafka

以下是我用于生成Avro类的架构的相关部分

{"namespace": "com.namespace.kafka.event",
 "type": "record",
 "name": "RecordName",
 "fields": [

    // some fields declared
    ...

    {"name": "products", "type": { "type": "array", "items": 
        {
            "name": "productInfo",
            "type": "record",
            "fields" : [
                {"name": "productId", "type": "int"},
                {"name": "productScore", "type": "float"}
            ]
        }
    }
},

// some more fields declared
...
Run Code Online (Sandbox Code Playgroud)

]}

我能够为这个模式生成类并填充它们.因此,基本上在生成中会生成一个名为productInfo的新类,它可以满足我的需求.(后来我将数据发送给Kafka).问题是反序列化.我使用的是这样的东西:

GenericData.Array<String> productTuple = (GenericData.Array<String>) record.get("products");
Run Code Online (Sandbox Code Playgroud)

这为GenericData数组的每个元素返回一个字符串(实际上是一个JSON).

{"productName" : someName, "productScore" : someScore }
Run Code Online (Sandbox Code Playgroud)

我可以解析这个字符串并得到我想要的东西但是有一种更"Avro"的方式来做到这一点.就像我可以将结果再次转换为像这样的GenericRecord对象.

GenericData.Array<GenericRecord> productTuple = (GenericData.Array<GenericRecord>) record.get("products");
Run Code Online (Sandbox Code Playgroud)

或者这将使用productInfo作为我的avro架构生成的类:

GenericData.Array<productInfo> productTuple = (GenericData.Array<productInfo>) 
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法测试它我没有一个简单的设置这样做.我搜索了整个网络,但找不到办法.任何帮助都感激不尽.

ral*_*aul 6

正确的方法是使用:

GenericData.Array<GenericRecord> productTuple =(GenericData.Array<GenericRecord>) record.get("products");
Run Code Online (Sandbox Code Playgroud)

我相信最后一个可能也可以正常工作但是这个允许我反序列化JSON而不会受到类的任何进一步干扰.