Json Golang检查接口类型是否为零

Json Golang检查接口类型是否为零,json,go,interface,Json,Go,Interface,当使用Golang的json.Unmarshal()函数对json字符串进行解组时,我总是将字符串解组到map[string]接口{}——我不确定是否有更好的解码json的方法 直截了当地说: 有时json的解组类型是nil,而不是string(或int等)。这总是引起恐慌,说: 接口转换:接口为nil,而不是int 如何避免这种恐慌或检查接口的类型是否为nil 示例: 下面是我遇到的问题的一个例子:检查密钥是否存在,而不是让它死机 func keyExists(decoded map[stri

当使用Golang的
json.Unmarshal()
函数对json字符串进行解组时,我总是将字符串解组到
map[string]接口{}
——我不确定是否有更好的解码json的方法

直截了当地说:

有时json的解组类型是
nil
,而不是
string
(或
int
等)。这总是引起恐慌,说:

接口转换:接口为nil,而不是int

如何避免这种恐慌或检查接口的类型是否为
nil

示例:


下面是我遇到的问题的一个例子:

检查密钥是否存在,而不是让它死机

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

我有一个关于定义结构并将json提取到其中的问题。如果我有一些json看起来像:{“name”:“Jimmy”,“traits”:{“age”:23,“gender”:0}。。。我如何定义结构中的“年龄”和“性别”值?下面是一个可以用来回答我问题的基础:制作一个嵌套结构
Traits
,其中包含
age
gender
。另外,请阅读软件包的文档谢谢您的快速回复。对于任何感兴趣的人,以下是我解决问题的方法: