【问题标题】:json.Marshal(struct) returns "{}"json.Marshal(struct) returns \"{}\"
【发布时间】:2022-12-02 10:31:15
【问题描述】:
type TestObject struct {
    kind string `json:"kind"`
    id   string `json:"id, omitempty"`
    name  string `json:"name"`
    email string `json:"email"`
}

func TestCreateSingleItemResponse(t *testing.T) {
    testObject := new(TestObject)
    testObject.kind = "TestObject"
    testObject.id = "f73h5jf8"
    testObject.name = "Yuri Gagarin"
    testObject.email = "Yuri.Gagarin@Vostok.com"

    fmt.Println(testObject)

    b, err := json.Marshal(testObject)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(b[:]))
}

Here is the output:

[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
    {TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com}
    {}
    PASS

Why is the JSON essentially empty?

【问题讨论】:

    标签: json go marshalling


    【解决方案1】:

    You need to export the fields in TestObject by capitalizing the first letter in the field name. Change kind to Kind and so on.

    type TestObject struct {
     Kind string `json:"kind"`
     Id   string `json:"id,omitempty"`
     Name  string `json:"name"`
     Email string `json:"email"`
    }
    

    The encoding/json package and similar packages ignore unexported fields.

    The `json:"..."` strings that follow the field declarations are struct tags. The tags in this struct set the names of the struct's fields when marshaling to and from JSON.

    Ru it on the playground.

    【讨论】:

    • there is supposed to be no "space" before "omitempty"
    • Can I make with small letter ?
    • If you want small letter tag the fields stackoverflow.com/questions/21825322/…
    • @user123456 Set the JSON field name to a lowercase name using the json field tag (as described in last paragraph of this answer).
    【解决方案2】:
    • When the first letter iscapitalised, the identifier is public to any piece of code that you want to use.
    • When the first letter islowercase, the identifier is private and could only be accessed within the package it was declared.

    Examples

     var aName // private
    
     var BigBro // public (exported)
    
     var 123abc // illegal
    
     func (p *Person) SetEmail(email string) {  // public because SetEmail() function starts with upper case
        p.email = email
     }
    
     func (p Person) email() string { // private because email() function starts with lower case
        return p.email
     }
    

    【讨论】:

    • awesome man, work perfect only change first letter to UPPER CASE, thank you so much
    • Exactly, In Go, a name is exported if it begins with a capital letter. To put it in context, visit this Go Basics Tour
    【解决方案3】:

    In golang

    in struct first letter must uppercase ex. phonenumber -> PhoneNumber

    ======= Add detail

    First, I'm try coding like this

    type Questions struct {
        id           string
        questionDesc string
        questionID   string
        ans          string
        choices      struct {
            choice1 string
            choice2 string
            choice3 string
            choice4 string
        }
    }
    

    golang compile is not error and not show warning. But response is empty because something

    After that, I search google found this article

    Struct Types and Struct Type Literals Article then... I try edit code.

    //Questions map field name like database
    type Questions struct {
        ID           string
        QuestionDesc string
        QuestionID   string
        Ans          string
        Choices      struct {
            Choice1 string
            Choice2 string
            Choice3 string
            Choice4 string
        }
    }
    

    Is work.

    Hope for help.

    【讨论】:

    • add more details
    • Yapp, I add more details.
    猜你喜欢
    • 2014-12-07
    • 2021-01-02
    • 1970-01-01
    • 2021-08-24
    • 2023-02-05
    • 2014-09-30
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多