Derivar tipos personalizados para JSON Unmarshaling en Go
Cuando se trabaja con tipos personalizados en Go, a menudo es necesario implementar la función UnmarshalJSON para habilitar conversión automática de JSON al tipo deseado. Sin embargo, surgen desafíos cuando el tipo se deriva de un valor escalar. Este artículo explora una solución para superar este problema.
Considere el ejemplo de un tipo PersonID que representa constantes enteras subtipificadas para identificar personas. Queremos ampliar la funcionalidad de este tipo para admitir la conversión automática de cadenas JSON. Implementar UnmarshalJSON para este tipo se vuelve difícil ya que su objetivo es devolver o modificar un valor escalar directamente, mientras que UnmarshalJSON espera una estructura para su modificación.
Para resolver esto, adoptamos un enfoque de receptor de puntero. Al utilizar un receptor de puntero, los cambios realizados dentro del método UnmarshalJSON se reflejan en el valor original. A continuación se muestra un ejemplo de la implementación de UnmarshalJSON modificada:
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 }
En esta implementación, el texto JSON se descompone en una variable de cadena antes de pasarlo a la función de búsqueda, que convierte la cadena al valor PersonID deseado. Luego, este valor se asigna al puntero intValue.
Además, para evitar conflictos entre las etiquetas JSON y los datos JSON, asegúrese de que las etiquetas en la estructura MyType coincidan con los nombres de los campos en JSON. Si sigue estos pasos, podrá implementar correctamente UnmarshalJSON para tipos escalares derivados.
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