Asignación de campos nulos a JSON en lugar de cadenas vacías en Golang
(2)
En la documentación del paquete json :
Los valores de puntero se codifican como el valor apuntado. Un puntero nulo se codifica como el objeto JSON nulo.
Por lo tanto, puede almacenar un puntero a una cadena que se codificará como una cadena si no es nula y se codificará como "nula" si nula
type student struct {
FirstName *string `json:"first_name"`
MiddleName *string `json:"middle_name"`
LastName *string `json:"last_name"`
}
Como la cadena vacía es el valor cero / predeterminado para la string
Golang, decidí definir todos los campos como interface{}
lugar. por ejemplo
type student struct {
FirstName interface{} `json:"first_name"`
MiddleName interface{} `json:"middle_name"`
LastName interface{} `json:"last_name"`
}
La aplicación que estoy enviando mis datos espera un valor nulo en lugar de una cadena vacía si el valor no está disponible para ese campo específico.
¿Es este el enfoque correcto o alguien puede indicarme algo mejor que esto?
Otra forma es en realidad una solución alternativa con el uso del método de interfaz MarhshalJSON y UnmarshalJSON ofrecido por el json lib de Golang. El código es el siguiente:
type MyType string
type MyStruct struct {
A MyType `json:"my_type"`
}
func (c MyType) MarshalJSON() ([]byte, error) {
var buf bytes.Buffer
if len(string(c)) == 0 {
buf.WriteString(`null`)
} else {
buf.WriteString(`"` + string(c) + `"`) // add double quation mark as json format required
}
return buf.Bytes(), nil
}
func (c *MyType)UnmarshalJSON(in []byte) error {
str := string(in)
if str == `null` {
*c = ""
return nil
}
res := MyType(str)
if len(res) >= 2 {
res = res[1:len(res)-1] // remove the wrapped qutation
}
*c = res
return nil
}
luego, cuando se utiliza json.Marshal, el valor de MyType se calculará como nulo.