json.Unmarshal 返回空白结构

Posted

技术标签:

【中文标题】json.Unmarshal 返回空白结构【英文标题】:json.Unmarshal returning blank structure 【发布时间】:2015-03-29 11:40:12 【问题描述】:

我有一个像这样的 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 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】:

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

EntryCount // <--- Exported
entryCount // <--- Not exported

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

至于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 规范以获得答案。具体来说,the part that talks about Exported Identifiers。

【讨论】:

这不应该被否决,但您应该提及 json 标记值,以便为编组的 json 提供所需的名称。喜欢json:"entry_count" 道歉。固定的。我是在工作中(我是 .NET 开发人员)进行大量代码讨论之后写的。 我要对此表示赞成,因为它对我有帮助。但是,伙计,这让我脾气暴躁。

以上是关于json.Unmarshal 返回空白结构的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Go Json.Unmarshal精度丢失之谜

如何检查 json 是不是与结构/结构字段匹配

[系列] Go - json.Unmarshal 遇到的小坑

golang json unmarshal #golang

Golang json Unmarshal “JSON 输入意外结束”

json.Unmarshal 嵌套对象成字符串或 []byte