20

I am using Go 1.0.3 on Mac OS X 10.8.2, and I am experimenting with the json package, trying to marshal a struct to json, but I keep getting an empty {} json object.

The err value is nil, so nothing is wrong according to the json.Marshal function, and the struct is correct. Why is this happening?

package main import ( "encoding/json" "fmt" ) type Address struct { street string extended string city string state string zip string } type Name struct { first string middle string last string } type Person struct { name Name age int address Address phone string } func main() { myname := Name{"Alfred", "H", "Eigenface"} myaddr := Address{"42 Place Rd", "Unit 2i", "Placeton", "ST", "00921"} me := Person{myname, 24, myaddr, "000 555-0001"} b, err := json.Marshal(me) if err != nil { fmt.Println(err) } fmt.Println(string(b)) // err is nil, but b is empty, why? fmt.Println("\n") fmt.Println(me) // me is as expected, full of data } 
0

3 Answers 3

44

You have to make the fields that you want to marshal public. Like this:

type Address struct { Street string Extended string City string State string Zip string } 

err is nil because all the exported fields, in this case there are none, were marshalled correctly.

Working example: https://play.golang.org/p/9NH9Bog8_C6

Check out the docs http://godoc.org/encoding/json/#Marshal

Sign up to request clarification or add additional context in comments.

1 Comment

That was it, I glossed over the line "Each exported struct field". Thank you.
5

Note that you can also manipulate what the name of the fields in the generated JSON are by doing the following:

type Name struct { First string `json:"firstname"` Middle string `json:"middlename"` Last string `json:"lastname"` } 

1 Comment

I like this way of associating structs and json objects.
1

JSON library cannot view the fields in a struct unless they are public. In your case,

type Person struct { name Name age int address Address phone string } 

the fields name, age, address and phone are not public (start with a small letter). In golang, variables/functions are public, when they start with a capital letter. So for this to work, your struct needs to look something like this:

type Person struct { Name Name Age int Address Address Phone string } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.