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:
[&]
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
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
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