19

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
}
tlehman
  • 5,125
  • 2
  • 33
  • 51

3 Answers3

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

lukad
  • 17,287
  • 3
  • 36
  • 53
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"` 
}
Camilo Crespo
  • 615
  • 5
  • 15
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
}
Lakhan Saiteja
  • 422
  • 3
  • 5