在Avro中,调用GenericRecord的toString()方法和使用JSONEncoder有什么区别吗?

7
我有一些Java中的Avro数据,它们是GenericRecord类型的,我想将其转换为JSON,并且我注意到有两种方法可以做到这一点:一种涉及使用JsonEncoder,另一种只需在GenericRecord上调用toString()
经过简短的实验,两种方法似乎都产生了等效的结果,并且生成的JSON字符串可以在任一情况下使用JsonDecoder转换回Avro。因此,我的问题是:
这两种方法之间是否存在功能差异,是否有理由选择其中一种?
我正在使用Avro 1.7.7。
1个回答

17
经过进一步测试和查看Avro源代码,似乎GenericRecord的toString()方法是由GenericData.Record.toString()实现的,它调用了GenericData.toString()。该方法的javadoc声明应该提供记录的有效JSON表示形式,它有些类似。但是,它在实现上与JsonEncoder不同,因为JsonEncoder使用Jackson库,并更加关注Avro模式。GenericRecord.toString()方法只是遍历记录并使用StringBuilder构建JSON表示形式,并没有如此关注Avro模式。这意味着在某些情况下,调用toString()将产生无法使用JSONDecoder反序列化的JSON表示形式,例如包含联合的架构情况。
基于此,看起来toString()方法是获取记录的易读表示的简单便捷方式,但作为根据架构序列化数据的方式不可靠。

你能分享一下如何将Avro通用记录转换为JSON吗? - dbustosp
我使用了JsonEncoder,因为我需要能够将JSON反序列化回GenericRecords。这里有一个使用JsonEncoder从GenericRecords编写JSON的示例:https://www.programcreek.com/java-api-examples/index.php?api=org.apache.avro.io.JsonEncoder - alphaloop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接