json - 如何在 Go 中从 interface{} 解码到 interface{}

标签 json go unmarshalling

我的系统中有多个节点通过 RPC 进行通信。我正在尝试通过 RPC 将 map[string] interface{} 发送到另一个节点。发件人使用 json.Marshal 和接收者使用 json.Unmarshal 来获取 map 。 让我们假设在发送端,map 包含 [1] => 2 其中 2 是 uint32 类型。
问题是 Unmarshal 试图找到底层数据的类型,并根据此处指定的默认行为将 2 转换为 float64 类型 https://blog.golang.org/json-and-go .后来,将 float64 转换为 uint32 会导致 panic 。

我引用了 How to unmarshal json into interface{} in golang? .但是为此,我们需要知道数据的类型。在我的例子中,数据可以是任何类型,所以我想将它保留为接口(interface){}。如何从 interface{} 解码到 interface{}?

最佳答案

不幸的是使用了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 的缺点是它是特定于 Go 的,不像语言和平台独立的 JSON。

关于json - 如何在 Go 中从 interface{} 解码到 interface{},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40823273/

相关文章:

java - 如何获取mysql数据库中所有列名的数据

json - Jq:步行时测试 field

javascript - 使用 D3.JS 绘制图表

function - Go 中函数类型有什么用途?

go - 如何使用 GORM (Go) 进行级联操作

android - "BadParcelableException: ClassNotFoundException when unmarshalling <myclass>"使用以 ClassLoader 作为参数的 Parcel.read 方法时

xml - Golang 将结构索引更改为定义值

javascript - 按日期排列 json 输出

go - Golang 中的匿名函数

java - 使用 Jaxb Unmarshall 获取 null 值