2016-06-11 122 views
1

使用Golang的json.Unmarshal()函数解组一个json字符串时,我总是将该字符串解组为一个map [string] interface {}。 我不确定天气有没有更好的解码json的方法。Golang检查接口类型是否为

为了说明问题,有时我解组的json类型是nil,而不是string(或int等)。这总是会引发恐慌,说“接口转换:接口是零,不是int”。我该如何避免这种恐慌或检查接口的类型是否为零?

这是我行动的问题的一个例子:主要存在的,而不是让它恐慌https://play.golang.org/p/0ATzXBbdoS

回答

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) 
} 
+0

我有一个关于定义一个结构并提取json的问题。如果我想让一些json看起来像:{“name”:“Jimmy”,“traits”:{“age”:23,“gender”:0}} ...如何定义值“age”和结构中的“性别”?这里有一个你可以从中解答我的问题的地方:https://play.golang.org/p/TyXbrFAtGo – Acidic

+1

制作一个包含'age'和'gender'的嵌套结构'Traits'。另外,请阅读[encoding/json](https://godoc.org/encoding/json#Marshal)软件包的文档 –

+1

感谢您的快速回复。对于任何有兴趣的人,以下是我如何解决我的问题:https://play.golang.org/p/mq5XL47msM – Acidic

相关问题