如何在 Go 中按需序列化 JSON 请求体中的可选字段

本文介绍如何使用 Go 的 json 标签(特别是 omitempty)配合指针类型,实现 HTTP 请求体中仅包含实际提供的字段,避免发送零值(如空字符串、0、nil)字段,提升 API 兼容性与请求简洁性。

本文介绍如何使用 Go 的 `json` 标签(特别是 `omitempty`)配合指针类型,实现 HTTP 请求体中仅包含实际提供的字段,避免发送零值(如空字符串、0、nil)字段,提升 API 兼容性与请求简洁性。

在构建 RESTful API 客户端或处理部分更新(PATCH)请求时,经常需要只提交用户显式修改的字段,而非将整个结构体所有字段(含零值)一并序列化为 JSON 发送。例如,原始结构体:

type MyStruct struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email"`
}

即使 Email 为空、Age 未修改,json.Marshal() 仍会输出:

{
  "name": "Kevin",
  "age": 0,
  "email": ""
}

这不仅冗余,还可能被服务端误判为“显式清空”,导致非预期的数据覆盖。

✅ 正确做法是结合 omitempty 标签与合适的数据类型:

完整示例:

package main

import (
    "encoding/json"
    "fmt"
)

type MyStruct struct {
    Name  string `json:"name,omitempty"`
    Age   *int   `json:"age,omitempty"`
    Email string `json:"email,omitempty"`
}

func main() {
    age := 25
    data := MyStruct{
        Name: "Kevin",
        Age:  &age,
        // Email 留空(空字符串),将被 omitempty 忽略
    }

    body, _ := json.Marshal(data)
    fmt.Println(string(body))
    // 输出:{"name":"Kevin","age":25}
}

⚠️ 注意事项:

通过合理组合 omitempty 与指针类型,你就能生成真正“按需”的轻量 JSON 请求体,既符合 REST 设计原则,也提升了前后端协作的健壮性。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。