2014-10-08 36 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

相關問題