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

时间:2014-10-30 14:49:21

标签: java json api serialization avro

过去一周,我一直试图使用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": {
    ...
}

因此,您可以看到类型对象反映了json对象的名称将在以后显示。 我找不到表示这种模式的方法。我过去曾使用过jackson来表示这样的多态类型,但我无法通过Avro的Java API找到解决方法。

我非常感谢您对此有任何帮助/建议。 :) 非常感谢。

1 个答案:

答案 0 :(得分:1)

您可能必须使用Avro-parlance中的内容称为"架构投影&#34 ;:也就是说,您定义了正在解析的不同架构的超集,并且Avro会根据需要忽略缺少的架构字段。它在Schema Resolution:

部分中描述

http://avro.apache.org/docs/1.7.7/spec.html

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