2014-10-30 47 views
0

將動態json類型序列化/反序列化過去一週我一直試圖使用Avro來映射流api中的數據。 我使用ReflectData從代表json響應的POJO創建我的模式。如何使用Avro

我然後使用ReflectDatumReader將json轉換爲avro字節,並且類似地使用反轉。

我面臨的問題與我得到的json響應有關。響應可以根據發送的消息類型而改變。

{ 
"id": 001, 
"text": { 
    "type": "comment", 
    "event": "event", 
    "comment": {  
    ... 
} 

但是這也可能是

{ 
"id": 001, 
"text": { 
    "type": "status", 
    "event": "event", 
    "status": { 
    ... 
} 

所以,你可以看到該類型的對象反映了JSON對象的名稱將在後面的內容。 我找不到表示這種模式的方法。過去我使用過傑克遜來表示像這樣的多態類型,但是我找不出用Avro的Java API做到這一點的方法。

我真的很感激任何幫助/建議。 :) 非常感謝。

回答

1

您可能不得不使用Avro -lance中的所謂「模式投影」:即定義您要解析的不同模式的超集,而Avro根據需要忽略丟失的模式字段。在此描述第架構解決方案:

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

這至少是理論。在實踐中,我經常不得不下降到(Java-)API代碼並明確地處理空值等。

+0

嘿@davek感謝您的回覆。所以,如果我從他們的規範中獲得了這個權利,似乎不可能有一位能夠管理具有多個名稱的字段的作者。我是否有權假設?即使我可以寫出第一個響應,當'comment'對象變爲'status'時,我會得到一個錯誤。 – Thanos 2014-10-30 17:21:08

+0

這是正確的:您必須定義包含* both *字段的超集架構:然後您可以解析駐留在正在讀取的記錄中的字段。 – davek 2014-10-31 15:08:10

相關問題