【问题标题】:JSON Unmarshall not working as expected with structs [duplicate]JSON Unmarshal 无法按预期使用结构 [重复]
【发布时间】:2015-12-30 21:34:24
【问题描述】:

我有以下代码:

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"`
}

【问题讨论】:

    标签: json go


    【解决方案1】:

    num 按照惯例不导出,因为它是小写的。把它改成Num就可以查看结果了。

    type SuperNum struct {
        Num string
    }                                                                                   
    

    【讨论】:

      【解决方案2】:

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

      Go playground

      【讨论】:

        【解决方案3】:

        当解组 JSON 结构时,您要映射的属性必须是公共的(请记住,在 Go 中,结构和模块成员的公共和私有可见性由成员名称的大写或小写驼峰式大小写表示。

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

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

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

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

        【讨论】:

        • 那么有没有什么时候我会将SuperNum 结构中的属性设置为num?为什么?
        猜你喜欢
        • 2017-07-24
        • 2020-04-15
        • 2017-11-05
        • 2020-03-11
        • 2018-01-16
        • 2016-10-13
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多