JSON Unmarshall在结构上没有按预期工作

时间:2015-12-30 21:34:24

标签: json go

我有以下代码:

package main

import "encoding/json"
import "fmt"

type SuperNum struct {
    num string
}

func main() {
    byt := []byte(`{"num":"6.13"}`)

    var dat SuperNum

    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", dat) // I expect this to have a `num` attribute
}

输出:

{num:}
Program exited.

您可以运行此代码in the golang playground

因为我在结构和JSON中设置了num属性并且它们都是字符串,所以我希望dat结构具有num属性,与'hello',但它没有。

我做错了什么?在我的心理模型中,这应该如何工作是不正确的?

修改

我尝试将json签名添加到结构中,但它没有任何区别(不知道它实际上是做什么的)。

type SuperNum struct {
    num string `json:"num"`
}

3 个答案:

答案 0 :(得分:4)

按惯例,

num不会导出,因为它是小写的。将其更改为Num,您就可以检查结果了。

type SuperNum struct {
    Num string
}                                                                                   

答案 1 :(得分:2)

只需将num更改为Num即可。结构的小写属性不可见。

Go playground

答案 2 :(得分:1)

当解组JSON结构时,您映射的属性必须是公共的(请记住,在Go中,结构和模块成员的公共和私有可见性由成员的名称为高或低表示骆驼案。

所以,首先,你的结构必须这样定义:

type SuperNum struct {
    Num string  // <- note the capital "N"
}

使用此结构,JSON编组器将期望JSON属性也被命名为Num。要配置不同的属性名称(如示例中的小写num),请对该结构成员使用json注释:

type SuperNum struct {
    Num string `json:"num"`
}