如何在 Go Gin 中修剪查询和 JSON 的空白?

4

我有一个结构体,长这样

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

我使用ShouldBind将查询参数或JSON body绑定到结构体中。

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

我想知道在字符串字段中去除空格的最佳实践是什么?

transform {"foo": "   bar   "} to struct {"foo": "bar"}
  • 我曾尝试使用自定义字符串类型并添加自定义的UnmarshalJSON函数,但如果是查询,则无法用于ctx.shouldBind。
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
}
  • 我也尝试使用conform,并为结构体添加标记。但是在绑定后,我必须添加conform.Strings(data),这很不方便。
type Data struct {
    Foo TrimSpaceString `json:"foo" binding:"required" conform:"trim"` 
}
err := ctx.ShouldBind(&data)
conform.Strings(&data)
  • 我是否应该自定义一个绑定和在绑定内部修剪字符串?

你可以尝试使用 json.Compact - Manjeet Thakur
2
^^^ json.Compact修剪不重要的空格。字符串内的空格不是无关紧要的。 - blackgreen
1个回答

2

我通过修改UnmarshalJSON函数使其正常工作。由于我也是新手,所以没有什么需要解释的,但我会尝试说明一下。不同之处在于我们通过json.Unmarshal将字节data转换为字符串。然后我们修剪字符串上的空格并将其附加到字段或原始字符串中。

type trim string

func (t *trim) UnmarshalJSON(data []byte) error {
    var s string
    if err := json.Unmarshal(data, &s); err != nil {
        return err
    }
    *t = trim(strings.TrimSpace(s))
    fmt.Printf("these are the strings: '%s'\n", *t)
    return nil
}

这里提供一个游乐场链接,如果您想亲自尝试 https://go.dev/play/p/BuxvMQibVsn

这是一个非常简洁的解决方案。我的问题是,现在当我使用类型为trim的变量作为字符串时,我需要进行转换string(myTrimmedString)。有没有其他解决办法呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接