"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar estructuras integradas con UnmarshalJSON personalizado en Go?

¿Cómo manejar estructuras integradas con UnmarshalJSON personalizado en Go?

Publicado el 2024-11-09
Navegar:895

How to Handle Embedded Structs with Custom UnmarshalJSON in Go?

Manejo de errores: desclasificación personalizada para estructuras incrustadas

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.

Estudio de caso

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.

Solución: campo explícito

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.

Ejemplo

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
}
Último tutorial Más>

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