json.Unmarshal返回空结构

29
我有一个JSON数据块,长这样:
{
    "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 Mydata
err1 := 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个回答

100

你的结构体字段没有导出。这是因为它们以小写字母开头。

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
}

在Go Playground上查看其运行情况

您还应参考Golang规范以获取答案。具体而言,请参阅关于导出标识符的部分


5
这个应该不会被踩,但你应该提到JSON标签值,以便为编组的JSON指定所需的名称。例如 json:"entry_count" - sberry
1
抱歉。问题已解决。我是一名.NET开发人员,在工作中进行了大量的代码讨论后写下了这篇文章。 - Simon Whitehead
5
我会点赞这篇文章,因为它对我有帮助。但是它让我感到很烦躁。 - sten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接