json.Marshal(struct) 返回“”

Posted

技术标签:

【中文标题】json.Marshal(struct) 返回“”【英文标题】:json.Marshal(struct) returns ""json.Marshal(struct) 返回“” 【发布时间】:2014-12-07 06:35:02 【问题描述】:
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[:]))

这是输出:

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

为什么 JSON 本质上是空的?

【问题讨论】:

【参考方案1】:

您需要通过将字段名称中的第一个字母大写来export TestObject 中的字段。将kind 更改为Kind 等等。

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

encoding/json 包和类似的包会忽略未导出的字段。

字段声明后面的`json:"..."` 字符串是struct tags。此结构中的标签在与 JSON 进行编组时设置结构字段的名称。

Ru it on the playground.

【讨论】:

“omitempty”之前应该没有“空格” 我可以用小写字母吗? 如果你想用小写字母标记字段***.com/questions/21825322/… @user123456 使用 json 字段标记将 JSON 字段名称设置为小写名称(如本答案最后一段所述)。【参考方案2】: 当第一个字母大写时,标识符对任何人都是公开的 您要使用的一段代码。 当首字母为小写时,标识符为私有且 只能在它声明的包内访问。

例子

 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
 

【讨论】:

很棒的人,完美的工作只是将第一个字母改为大写,非常感谢 没错,In Go, a name is exported if it begins with a capital letter。把它放在上下文中,访问这个Go Basics Tour【参考方案3】:

在 golang 中

struct 中首字母必须大写 前任。电话号码 -> 电话号码

======= 添加详细信息

首先,我正在尝试这样的编码

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

golang 编译没有错误,也没有显示警告。但是响应是空的,因为某事

之后,我搜索谷歌找到了这篇文章

结构类型和结构类型文字 Article 然后...我尝试编辑代码。

//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
    

工作。

希望得到帮助。

【讨论】:

添加更多细节 Yapp,我添加更多细节。

以上是关于json.Marshal(struct) 返回“”的主要内容,如果未能解决你的问题,请参考以下文章

struct和[]byte的转换,注意结构体内变量首字母一定大写

json.Marshal(): json: 为 msgraph.Application 类型调用 MarshalJSON 时出错

http.newRequest 的 json.Marshal 正文如何

golang里的json marshal && unmarshal

golangGo中json.Marshal函数

踩了大坑 : go json.Marshal时,结构体字段需要大写