En Go, al descomponer datos JSON en una estructura con campos incrustados, uno puede encontrar problemas si la estructura incrustada define su propio método UnmarshalJSON. Esto se debe a que la biblioteca JSON llama al UnmarshalJSON de la estructura incrustada e ignora los campos definidos en la estructura que la contiene.
Considere la siguiente definición de estructura:
type Outer struct {
Inner
Num int
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
Al descomponer JSON en Outer usando json.Unmarshal(data, &Outer{}), el campo Inner activa su método UnmarshalJSON, consumiendo toda la cadena JSON. Esto hace que se ignore el campo Num en Outer.
Para resolver este problema, convierta la estructura incrustada Inner en un campo explícito en Outer:
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
Al hacer que Inner sea un campo explícito, te aseguras de que la biblioteca JSON desglose los datos en los campos apropiados de Outer, incluido el campo Num.
import (
"encoding/json"
"fmt"
)
type Outer struct {
I Inner // make Inner an explicit field
Num int `json:"Num"`
}
type Inner struct {
Data string
}
func (i *Inner) UnmarshalJSON(data []byte) error {
i.Data = string(data)
return nil
}
func main() {
data := []byte(`{"Data": "Example", "Num": 42}`)
var outer Outer
err := json.Unmarshal(data, &outer)
if err != nil {
fmt.Println(err)
}
fmt.Println(outer.I.Data, outer.Num) // Output: Example 42
}
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3