es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo recortar espacios en blanco para consultas y JSON en Go Gin?

Tengo una estructura como esta:

type Data struct {
    Foo string `json:"foo" binding:"required"` 
}

Y uso ShouldBind para vincular la consulta o el cuerpo JSON a la estructura.

data := Data{}
err := ctx.ShouldBind(&data)

Me preguntaba cuál es la mejor práctica para recortar los espacios en blanco en el campo de texto.

transform {"foo": "   bar   "} a struct {"foo": "bar"}

He intentado usar un tipo de string personalizado y agregar una función UnmarshalJSON personalizada, pero no funcionará para ctx.shouldBind si es una consulta.

type Data struct {
    Foo TrimSpaceString `json:"foo" binding:"required"` 
}
type TrimSpaceString string

func (t *TrimSpaceString) UnmarshalJSON(data []byte) error {
    data = bytes.Trim(data, "\"")
    data = bytes.Trim(data, " ")
    *t = TrimSpaceString(strings.TrimSpace(string(data)))
    return nil
}

También intenté usar conform y agregar una etiqueta a la estructura. Pero tengo que agregar conform.Strings(data) después de vincularlo y no es conveniente.

type Data struct {
    Foo TrimSpaceString `json:"foo" binding:"required" conform:"trim"` 
}
err := ctx.ShouldBind(&data)
conform.Strings(&data)

¿Debería crear una vinculación personalizada y recortar la cadena dentro de la vinculación?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, personalizar una vinculación es una buena solución para recortar los espacios en blanco en el campo de texto. Puedes crear una vinculación personalizada y sobreescribir el método Bind para recortar los valores de texto antes de la vinculación a la estructura.

    Aquí hay un ejemplo de cómo crear una vinculación personalizada para go-gin:

    type CustomBinding struct{}
    
    func (binding CustomBinding) Name() string {
        return "custom"
    }
    
    func (binding CustomBinding) Bind(ctx *gin.Context, obj interface{}) error {
        err := ctx.ShouldBind(obj)
        if err != nil {
            return err
        }
        // iterar a través de los campos de la estructura y recortar los valores de texto
        val := reflect.ValueOf(obj).Elem()
        for i := 0; i < val.NumField(); i++ {
            fieldType := val.Type().Field(i)
            if fieldType.Type.Kind() == reflect.String {
                fieldVal := val.Field(i)
                trimmed := strings.TrimSpace(fieldVal.String())
                fieldVal.SetString(trimmed)
            }
        }
        return nil
    }
    

    Ahora puedes usar CustomBinding cuando vincules los datos a tu estructura:

    data := Data{}
    err := ctx.MustBindWith(&data, CustomBinding{})
    

    Esto recortará los espacios en blanco para todos los campos de texto en tu estructura.

Comments are closed.