json.Marshal(struct) returns "{}"

JsonGoMarshalling

Json Problem Overview


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 = "[email protected]"

	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 Solutions


Solution 1 - Json

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.

Solution 2 - Json

  • 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
 }

Solution 3 - Json

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.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDoug KnesekView Question on Stackoverflow
Solution 1 - JsonBayta DarellView Answer on Stackoverflow
Solution 2 - JsonSourabh BhagatView Answer on Stackoverflow
Solution 3 - JsonsuperupView Answer on Stackoverflow