结构体字段的多个 JSON 标签
在从服务器接收 JSON 数据并需要将其解组到结构体的场景中,您可能会遇到这样的情况:您想要使用不同的 JSON 标签来表示相同的数据
自定义 JSON 标签
JSON 标签指定 JSON 表示中使用的字段名称。默认情况下,字段的标签与字段名称相同。但是,您可以自定义标签以更改序列化或反序列化结构时使用的名称。
单个 JSON 标签
使用单个 JSON 标签非常简单。只需将所需的标签指定为字符串文字:
type Foo struct { Name string `json:"name"` Age int `json:"age"` }
多个 JSON 标签
如问题中所述,不可能将多个 JSON 标签直接附加到单个字段。但是,有一种技术可以让您解决此限制。
结构体转换
给定的解决方案建议使用两个具有相同字段布局的结构体。例如:
type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` }
然后,您可以将 Foo 结构转换为 Bar 结构以更改 JSON 标签。当您有大量字段时,此技术特别有用:
foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo))
注意
请务必注意,应取消导出第二个结构以防止出现这种情况防止在当前包之外被访问。这可确保仅按预期执行转换,而不会意外误用。
示例
以下代码演示了上述转换技术:
package main import ( "encoding/json" "fmt" ) type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` } func main() { foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo)) jsonBytes, err := json.Marshal(bar) if err != nil { fmt.Println(err) return } fmt.Println(string(jsonBytes)) }
此代码使用 Bar 结构中定义的 JSON 标签成功序列化 Foo 结构数据。它产生以下 JSON 输出:
{"employee_name":"Sam"}
以上是如何在 Go 中对单个结构体字段使用多个 JSON 标签?的详细内容。更多信息请关注PHP中文网其他相关文章!