I'm convert interface{} to map[string]string.
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := `{"1":"2", "3": "4"}`
var v interface{}
json.Unmarshal([]byte(data), &v)
fmt.Printf("%+vn", v)
_, ok := v.(map[string]interface{})
fmt.Printf("%vn", ok)
_, ok = v.(map[string]string)
fmt.Printf("%vn", ok)
_, ok = v.(map[interface{}]interface{})
fmt.Printf("%vn", ok)
}
代码在这里 https://play.golang.org/p/I_clyMdaGzw
为什么map[string]interface{}是可以的,但是map[string]string,map[interface{}]interface{}不起作用?
https://godoc.org/encoding/json#Unmarshal
To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:
bool, for JSON booleans
float64, for JSON numbers
string, for JSON strings
[]interface{}, for JSON arrays
map[string]interface{}, for JSON objects
nil for JSON null
由于interface{}
用于解码,因此 JSON 对象的默认类型为 map[string]interface{}
将json
对象解组到map
或interface
将始终使用map[string]interface{}
来解组 JSON 对象(如 beiping96 在他的回答中指出的那样(。
使用reflect.TypeOf
查看变量的类型。只能将其强制转换为该类型。如果你想要另一种类型,你需要转换它。
这里有一个例子来map[string]string
:
func main() {
data := `{"1":"2", "3": "4"}`
var v interface{}
if err := json.Unmarshal([]byte(data), &v); err != nil {
log.Fatal(err)
}
var res = map[string]string{}
for k, v := range v.(map[string]interface{}) {
res[k] = v.(string)
}
fmt.Println(reflect.TypeOf(res), res)
}
注意:我假设结构是已知的,我没有检查类型。如果类型不如假设,这将引起恐慌。使用您用来防止恐慌的val, ok := ...
模式。
然而,以上并不是元帅map[string]string
的惯用方式。通常的方法(如果您知道 JSON 字符串的结构(是让 json
包处理类型转换:
func main() {
data := `{"1":"2", "3": "4"}`
var res map[string]string
if err := json.Unmarshal([]byte(data), &res); err != nil {
log.Fatal(err)
}
fmt.Println(reflect.TypeOf(res), res)
}