如何从Go

时间:2016-11-26 21:20:10

标签: json go unmarshalling

我的系统中有多个节点通过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?。但为此,我们需要知道数据的类型。在我的情况下,数据可以是任何类型,所以我想将它保持为接口{}。如何从接口{}解析到接口{}?

1 个答案:

答案 0 :(得分: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不同,特定于Go。