"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 implementar unmarshaljson para los tipos escalar derivados en GO?

¿Cómo implementar unmarshaljson para los tipos escalar derivados en GO?

Publicado el 2025-04-13
Navegar:582

How to Implement UnmarshalJSON for Derived Scalar Types in Go?

unmarshaljson Implementación para escalares derivados en go

problema:
un tipo personalizado que convierte los constantes de introducción subtensados ​​en Strings y Vice Versa requiere un nomarshalling automático de json. Esto es un desafío porque unmarshaljson no proporciona una forma de modificar el valor escalar sin usar una estructura.

SOLUCIÓN:
para implementar unmarshaljson para un tipo escalar derivado, considere los siguientes pasos:

[&] [&] use un receptor de un puntero:
unmarshal a una cadena:

unmarshal el texto json en una cadena simple, eliminar todo json citando. Busque y establece el valor:
[&]

citando. Personido basado en el valor de la cadena. Asigne el resultado al receptor.

Ejemplo:

func (intValue *personid) unmarshaljson (data [] byte) error { cadena var s si err: = json.unmarshal (datos, & s); err! = nil { devolver err } *intValue = Lookup (s) regresar nulo }

Ejemplo de ejemplo:
func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

paquete principal importar ( "Codificación/JSON" "FMT" ) Tipo Personid int const ( Bob Personid = IOTA Jane Ralph Nadie = -1 ) var namEmap = map [string] PersonId { "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nadie": Nadie, } var idmap = map [personido] cadena { Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nadie: "nadie", } func (intValue personaID) name () cadena { return idmap [intValue] } FUNC BUSTUP (Nombre String) PersonId { devolver namEmap [nombre] } FUNC (intValue *personido) unmarshaljson (data [] byte) error { cadena var s si err: = json.unmarshal (datos, & s); err! = nil { devolver err } *intValue = Lookup (s) regresar nulo } Escriba mytype struct { Persona persona `json:" persona "` Count Int `json:" contar "` Cadena de saludo `JSON:" Saludo "` } func Main () { var m mytype if err: = json.unmarshal ([] byte (`{" persona ":" ralph "," contar ": 4," saludo ":" hola "}`), & m); err! = nil { fmt.println (err) } demás { para i: = 0; i output:

package main

import (
    "encoding/json"
    "fmt"
)

type PersonID int

const (
    Bob PersonID = iota
    Jane
    Ralph
    Nobody = -1
)

var nameMap = map[string]PersonID{
    "Bob":    Bob,
    "Jane":   Jane,
    "Ralph":  Ralph,
    "Nobody": Nobody,
}

var idMap = map[PersonID]string{
    Bob:    "Bob",
    Jane:   "Jane",
    Ralph:  "Ralph",
    Nobody: "Nobody",
}

func (intValue PersonID) Name() string {
    return idMap[intValue]
}

func Lookup(name string) PersonID {
    return nameMap[name]
}

func (intValue *PersonID) UnmarshalJSON(data []byte) error {
  var s string
  if err := json.Unmarshal(data, &s); err != nil {
    return err
  }
  *intValue = Lookup(s)
  return nil
}

type MyType struct {
    Person   PersonID `json: "person"`
    Count    int      `json: "count"`
    Greeting string   `json: "greeting"`
}

func main() {
    var m MyType
    if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil {
        fmt.Println(err)
    } else {
        for i := 0; i 
Ú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