当使用Golang的json.Unmarshal()
函数解组一串json时,我总是将字符串解组为map[string]interface{}
- 我不确定天气是否存在更优化解码json的方法。
要明白:
有时,json的解组类型为nil
,而非string
(或int
等)。这总是引起恐慌,说:
接口转换:接口为nil,而不是int
如何避免此恐慌或检查界面的类型是否为nil
?
示例:
以下是我的问题实例:https://play.golang.org/p/0ATzXBbdoS
答案 0 :(得分:1)
检查是关键存在而不是让它恐慌。
func keyExists(decoded map[string]interface{}, key string) {
val, ok := decoded[key]
return ok && val != nil
}
func main() {
jsonText := `{
"name": "Jimmy",
"age": 23
}`
var decoded map[string]interface{}
if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil {
fmt.Println(err)
os.Exit(0)
}
if keyExists(decoded, "name") {
fmt.Println(decoded["name"].(string))
}
if keyExists(decoded, "age") {
fmt.Println(decoded["age"].(float64))
}
if keyExists(decoded, "gender") {
fmt.Println(decoded["gender"].(int))
}
}
另外,如果你知道你的json会是什么样子,这远非最佳。如文档中所述,您可以将其直接解组为结构:
type Human struct {
Name string
Age int
Gender int
}
func main() {
jsonText := `{
"name": "Jimmy",
"age": 23
}`
decoded := Human{}
if err := json.Unmarshal([]byte(jsonText), &decoded); err != nil {
fmt.Println(err)
os.Exit(0)
}
fmt.Println(decoded.Name)
fmt.Println(decoded.Age)
fmt.Println(decoded.Gender)
}