2013-04-14 46 views
7

欲deserialise的對象,其包括一些接口Entity陣列的JSON數組:解組異質結構

type Result struct { 
    Foo int; 
    Bar []Entity; 
}; 

Entity是由多個結構類型的實現的接口。 JSON數據用每個實體中的「類型」字段標識結構類型。例如。

{"type":"t1","field1":1} 
{"type":"t2","field2":2,"field3":3} 

我怎麼會去這樣一種方式,它正確地填充陣列deserialising的Result類型。從我所看到的,我必須:

  1. 實施UnmarshalJSONResult
  2. 解析Bar作爲[]*json.RawMessage
  3. 解析每條原始信息爲map[string]interface{}
  4. 檢查原始消息中的「type」字段。
  5. 創建適當類型的結構。
  6. 解析原始消息再次,這次進入剛剛創建的結構。

這一切聽起來很乏味乏味。有一個更好的方法嗎?還是我倒退了呢,還有更規範的方法來處理異構對象的數組?

回答

5

我認爲你的過程可能比它更復雜一些,請參閱http://play.golang.org/p/0gahcMpuQc。單個map [string] interface {}將爲你處理很多事情。

或者,你可以做一個類型像

struct EntityUnion { 
    Type string 
    // Fields from t1 
    // Fields from t2 
    // ... 
} 

解組成;它將設置Type字符串並填充它可以從JSON數據獲取的所有字段。然後你只需要一個小函數來將字段複製到特定的類型。

+0

我結束了一個「聯合」結構。它感到骯髒,但最終解放了。 –