首页 > 后端开发 > Golang > 如何在 Go 中对单个结构体字段使用多个 JSON 标签?

如何在 Go 中对单个结构体字段使用多个 JSON 标签?

Mary-Kate Olsen
发布: 2024-12-17 03:25:25
原创
411 人浏览过

How to Use Multiple JSON Tags for a Single Struct Field in Go?

结构体字段的多个 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板