在Avro中,在GenericRecord上调用toString()和使用JSONEncoder之间有什么区别吗?

时间:2014-10-08 00:30:26

标签: java json avro

我在Java中有一些Avro数据作为GenericRecord我要转换为JSON,我注意到有两种方法可以做到这一点:一种涉及使用JsonEncoder,另一种涉及只需在toString()上调用GenericRecord

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

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

我正在使用Avro 1.7.7。

1 个答案:

答案 0 :(得分:11)

经过一些进一步测试后看看Avro源代码,似乎GenericRecord上的toString()方法是由GenericData.Record.toString()实现的,它调用GenericData.toString()。这个方法的javadoc声明它应该提供记录的有效JSON表示,它可以做到。

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

这意味着有些情况下调用toString()将生成一个无法使用JSONDecoder反序列化的JSON表示,例如在模式包含联合的情况下。

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