Golang检查未封送的JSON值是否为nil

pwuypxnk  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(147)

当使用Golang的json.Unmarshal()函数解组一个json字符串时,我总是将字符串解组为map[string]interface{}- * 我不确定是否有更好的方法来解码json。

进入正题:

有时json的未编组类型是nil,而不是string(或int等)。这总是会引发恐慌,说:
接口转换:接口为nil,不是int
如何避免这种恐慌或检查接口的类型是否为nil

示例:

下面是我的问题的一个例子:https://play.golang.org/p/0ATzXBbdoS

uoifb46i

uoifb46i1#

检查密钥是否存在,而不是让它恐慌。

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

相关问题