2016-11-26 37 views
2

我的系統中有多個通過RPC進行通信的節點。我想通過RPC發送一個map [string] interface {}到另一個節點。發件人使用json.Marshal和接收器使用json.Unmarshal來獲取地圖。 讓我們在發送方說,映射包含[1] => 2其中2是類型uint32。
問題是Unmarshal嘗試查找底層數據的類型,並根據其在此處指定的默認行爲https://blog.golang.org/json-and-go將2轉換爲float64類型。之後,將float64轉換爲uint32會導致恐慌。我提到How to unmarshal json into interface{} in golang?。但爲此,我們需要知道數據的類型。在我的情況下,數據可以是任何類型,所以我想保留它作爲interface {}。如何從界面{}解組到接口{}?如何在接口{}中解組到接口{}

回答

3

不幸的是,使用encoding/json軟件包不行,因爲沒有傳輸類型信息,並且如果類型信息不存在,默認情況下將JSON編號解組爲float64類型的值。您需要定義struct類型,其中您明確聲明該字段類型爲uint32

或者,您可以選擇使用encoding/gob,它傳輸並保存類型信息。看到這個例子:

m := map[string]interface{}{"1": uint32(1)} 

b := &bytes.Buffer{} 
gob.NewEncoder(b).Encode(m) 

var m2 map[string]interface{} 
gob.NewDecoder(b).Decode(&m2) 
fmt.Printf("%T\n%#v\n", m2["1"], m2) 

輸出(嘗試在Go Playground):

uint32 
map[string]interface {}{"1":0x1} 

gob的缺點是,它是進入特定不像語言和平臺無關JSON。