json.Unmarshal returning blank structure

末鹿安然 提交于 2019-11-26 08:35:34

问题


I have a JSON blob that looks like this

{
    \"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\"
    }]
}

and I have a little code to transform that back into go structs

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)

but what I see when I run this is just a zeroed structure

main.Mydata: {met:{to: from: id: entryCount:0 size:0 depricated:false} stat:[]}

I tried allocating the struct first but that also didn\'t work, I\'m not sure why its not producing values, and its not returning an error


回答1:


Your struct fields are not exported. This is because they start with a lowercase letter.

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

When I say "not exported", I mean they are not visible outside of your package. Your package can happily access them because they are scoped locally to it.

As for the encoding/json package though - it cannot see them. You need to make all of your fields visible to the encoding/json package by making them all start with an uppercase letter, thereby exporting them:

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

You should also reference the Golang specification for answers. Specifically, the part that talks about Exported Identifiers.



来源:https://stackoverflow.com/questions/28228393/json-unmarshal-returning-blank-structure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!