为了账号安全,请及时绑定邮箱和手机立即绑定

json.Unmarshal 返回空白结构

json.Unmarshal 返回空白结构

Go
犯罪嫌疑人X 2021-09-13 14:48:22
我有一个看起来像这样的 JSON blob{    "metadata":{        "id":"2377f625-619b-4e20-90af-9a6cbfb80040",        "from":"2014-12-30T07:23:42.000Z",        "to":"2015-01-14T05:11:51.000Z",        "entryCount":801,        "size":821472,        "deprecated":false    },    "status":[{         "node_id":"de713614-be3d-4c39-a3f8-1154957e46a6",         "status":"PUBLISHED"    }]}我有一些代码可以将其转换回 go 结构type Status struct {    status string    node_id string}type Meta struct {    to string    from string    id string    entryCount int64    size int64    depricated bool}type Mydata struct {    met meta    stat []status}var realdata Mydataerr1 := json.Unmarshal(data, &realdata)if err1 != nil {    fmt.Println("error:", err1)}fmt.Printf("%T: %+v\n", realdata, realdata)但是我运行时看到的只是一个归零结构main.Mydata: {met:{to: from: id: entryCount:0 size:0 depricated:false} stat:[]}我尝试先分配结构,但这也不起作用,我不确定为什么它不产生值,并且不返回错误
查看完整描述

1 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您的结构字段不会导出。这是因为它们以小写字母开头。


EntryCount // <--- Exported

entryCount // <--- Not exported

当我说“未导出”时,我的意思是它们在您的包裹之外是不可见的。您的包可以愉快地访问它们,因为它们在本地范围内。


至于encoding/json包裹——它看不到它们。您需要通过使所有字段encoding/json都以大写字母开头来使所有字段对包可见,从而导出它们:


type Status struct {

    Status  string

    Node_id string

}


type Meta struct {

    To         string

    From       string

    Id         string

    EntryCount int64

    Size       int64

    Depricated bool

}


type Mydata struct {

    Metadata  Meta

    Status []Status

}

See it working on the Go Playground here


您还应该参考 Golang 规范以获取答案。具体来说,是关于 Exported Identifiers 的部分。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 203 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信