目前,我尝试将 JSON 解析为 map[string][]interface{},但解码返回错误。根据 ( https://golang.org/pkg/encoding/json/ ),为了将 JSON 解码为接口(interface)值,Unmarshal 将其中之一存储在接口(interface)值中:
- bool,用于 JSON bool 值
- float64,用于 JSON 数字
- string,用于 JSON 字符串 -[]接口(interface){},用于JSON数组
- map[string]interface{},用于 JSON 对象
- nil 表示 JSON null
我想知道 golang 是否能够解码 map[string][]interface{}。以下是代码片段。我是 Golang 的新手,在此先感谢您的帮助。
// emailsStr looks like "{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}"
emailsRaw := make(map[string][]*entities.Email)
err := json.Unmarshal([]byte(emailsStr), &emailsRaw)
错误信息:
&json.UnmarshalTypeError{Value:"number", Type:(*reflect.rtype)(0x151c7a0), Offset:44, Struct:"", Field:""}
最佳答案
围棋 encoding/json
包只会动态解码为 map[string]interface{}
.从那里,您将需要使用类型断言和强制转换来提取您想要的值,如下所示:
func main() {
jsonStr := `{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}`
dynamic := make(map[string]interface{})
json.Unmarshal([]byte(jsonStr), &dynamic)
firstEmail := dynamic["unknown.0"].([]interface{})[0].(map[string]interface{})["email_address"]
fmt.Println(firstEmail)
}
( https://play.golang.org/p/VEUEIwj3CIC )
每次,Go 的 .(<type>)
运算符用于断言动态值并将其转换为特定类型。如果在运行时发生任何错误类型,这个特定的代码将会崩溃,就像 unknown.0
的内容一样。不是 JSON 对象数组。
在 Go 中更惯用(和健壮)的方法是用 json:""
注释几个结构。标签并有 encoding/json
解编成他们。这避免了所有讨厌的脆弱.([]interface{})
类型转换:
type Email struct {
Email string `json:"email_address"`
}
type EmailsList struct {
IsSchemaConforming bool `json:"isSchemaConforming"`
SchemaVersion int `json:"schemaVersion"`
Emails []Email `json:"unknown.0"`
}
func main() {
jsonStr := `{"isSchemaConforming":true,"schemaVersion":0,"unknown.0":[{"email_address":"test1@uber.com"},{"email_address":"test2@uber.com"}]}`
emails := EmailsList{}
json.Unmarshal([]byte(jsonStr), &emails)
fmt.Printf("%+v\n", emails)
}
关于json - Go 能够解码为 map[string][]interface{} 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48727958/