2014-10-08 195 views
3

我有一些Java的GenericRecord s的Avro数据,我想转换为JSON,我注意到有两种方法可以做到这一点:一种涉及使用JsonEncoder,另一种涉及简单地在GenericRecord上调用toString()在Avro中,调用GenericRecord的toString()和使用JSONEncoder有什么区别?

经过一些简短的实验后,两种方法似乎都会产生相同的结果,并且在任何一种情况下,生成的JSON字符串都可以使用JsonDecoder转换回Avro。所以,我的问题是:

两者之间是否有任何功能差异,是否有任何理由使用一个在另一个?

我正在使用Avro 1.7.7。

回答

5

在进一步测试了一下Avro源代码后,似乎GenericRecord上的toString()方法由调用GenericData.toString()的GenericData.Record.toString()实现。这个方法的javadoc指出它应该提供记录的有效JSON表示,它有点类似。

然而,它的实现与JsonEncoder的不同之处在于,JsonEncoder使用了Jackson库,并且更加关注Avro模式。 GenericRecord.toString()方法使用StringBuilder简单地遍历记录并构建JSON表示,并且不会如此密切关注Avro模式。

这意味着在调用toString()时会产生无法使用JSONDecoder进行反序列化的JSON表示,例如在模式包含联合的情况下。

基于此看起来,toString()方法是获取记录的人类可读表示的一种简单而方便的方式,但作为根据模式序列化数据的一种方式并不可靠。

+0

你能分享你是如何将avro通用记录转换成json的? – dbustosp 2017-09-08 11:46:17

+0

我使用了JsonEncoder,因为我需要能够将JSON反序列化成GenericRecords。有一个使用JsonEncoder从GenericRecords中写出JSON的例子:https://www.programcreek.com/java-api-examples/index.php?api=org.apache.avro.io.JsonEncoder – alphaloop 2017-09-17 06:49:30

相关问题