英文:
json.Marshal(struct) returns "{}"
问题
这是因为在结构体字段的标签中,json
应该是小写的,而不是大写的。在你的代码中,json
标签中的引号被转义了,所以它们没有被正确地解析为结构体的标签。你需要将json
标签中的引号改为双引号,并将json
标签中的字段名改为小写字母。修改后的代码如下所示:
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[:]))
}
这样修改后,你应该能够正确地生成非空的 JSON 数据了。
英文:
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?
答案1
得分: 336
你需要通过将字段名的首字母大写来导出 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:"..."`
字符串是结构标签。这些标签设置了在将结构体编组为 JSON 时的字段名称。
在Playground上运行它。
英文:
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.
答案2
得分: 33
- 当标识符的首字母大写时,该标识符对于任何想要使用的代码片段都是公开的。
- 当标识符的首字母小写时,该标识符是私有的,只能在声明它的包内部访问。
示例:
var aName // 私有
var BigBro // 公开(导出的)
var 123abc // 非法
func (p *Person) SetEmail(email string) { // 公开,因为SetEmail()函数以大写字母开头
p.email = email
}
func (p Person) email() string { // 私有,因为email()函数以小写字母开头
return p.email
}
英文:
- When the first letter is capitalised, the identifier is public to any
piece of code that you want to use. - When the first letter is lowercase, 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
}
答案3
得分: 7
在Go语言中,结构体的首字母必须大写。例如,"phonenumber" 应该写成 "PhoneNumber"。
在你的代码中,首先我尝试了以下写法:
type Questions struct {
id string
questionDesc string
questionID string
ans string
choices struct {
choice1 string
choice2 string
choice3 string
choice4 string
}
}
Go语言编译没有报错也没有警告。但是返回的结果是空的,因为有些问题。
之后,我在Google上搜索到了这篇文章:Struct Types and Struct Type Literals,然后我尝试修改了代码:
//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
}
}
这样就可以正常工作了。
希望对你有帮助。
英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论