用avro实现java嵌套的特定类型反序列化

ac1kyiln  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(538)

下面是我用来生成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
...

] }
我能够为这个模式生成类并填充它们。因此,基本上在这一代中,生成了一个名为productinfo的新类,它满足了我的需要(后来我把数据发给Kafka)。问题是反序列化。我用的是这样的东西:

GenericData.Array<String> productTuple = (GenericData.Array<String>) record.get("products");

对于genericdata数组的每个元素,这将返回一个类似这样的字符串(实际上是一个json)。

{"productName" : someName, "productScore" : someScore }

我可以解析这个字符串并得到我想要的,但是有没有更“avro”的方法来实现这一点。我可以将结果再次投射到这样的genericrecord对象。

GenericData.Array<GenericRecord> productTuple = (GenericData.Array<GenericRecord>) record.get("products");

或者当productinfo是从我的avro模式生成的类时,这是否有效:

GenericData.Array<productInfo> productTuple = (GenericData.Array<productInfo>)

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

4uqofj5v

4uqofj5v1#

正确的方法是使用:

GenericData.Array<GenericRecord> productTuple =(GenericData.Array<GenericRecord>) record.get("products");

我相信最后一个也可以,但是这个可以让我反序列化json而不需要任何来自类的进一步干扰。

相关问题