json.Marshal(struct) 返回 “{}”

huangapple go评论101阅读模式
英文:

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.

Ru it on the playground.

答案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.

huangapple
  • 本文由 发表于 2014年10月13日 00:34:12
  • 转载请务必保留本文链接:https://go.coder-hub.com/26327391.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定