How do we get the tag information when implementing the JSON marshaler interface when marshaling the Foo instance below? Note that we can also have a Bar struct which also uses MyNullString. So we cannot assume MyNullString is being used only by Foo struct.
package main
import (
"fmt"
"database/sql"
"encoding/json"
)
type MyNullString struct {
sql.NullString
}
type Foo struct {
MyInt int64
MyString MyNullString `json:"my_string,omitempty"`
}
func (s *MyNullString) MarshalJSON() ([]byte, error){
//Inspect tag of struct instance and see if this field has to be omitted when empty
//HOW?????
//Note: We can use MyNullString in other structs as well.
}
func main(){
foo := Foo{MyInt: 1}
data, _ := json.Marshal(&foo)
fmt.Println(string(data))
}
It's not possible for a type to inspect other types/values that contain it (you can't see the box you're in, but you can see the boxes in you). There is an open feature request for custom omitempty support, such that a type can inform the encoder that it's an "empty" value, but there's nothing usable at this time. See http://golang.org/issue/4357