GO: 结构体字段后面的 `json` 标注

在 Go 语言中,在 Go 语言中,结构体字段后面的 json 标注是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {
    Field1 string `json:"field1_name"`
    Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {
        Name     string `json:"username"`
        Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {
        Name     string `json:"username"`
        Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {
        Name  string `json:"username,omitempty"`
        Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {
        Street string `json:"street"`
        City   string `json:"city"`
    }
    
    type User struct {
        Name    string  `json:"username"`
        Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name     string `json:"username"`
    Age      int    `json:"age,omitempty"`
    Password string `json:"-"`
}

func main() {
    user := User{
        Name:     "Alice",
        Age:      0,  // 这里是零值
        Password: "secret",
    }

    // 将结构体转换为 JSON
    jsonData, _ := json.Marshal(user)
    fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。
  • 可以指定字段名、忽略字段、忽略零值字段。
  • 在序列化和反序列化过程中,json 标注提供了灵活的字段控制。是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {
    Field1 string `json:"field1_name"`
    Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {
        Name     string `json:"username"`
        Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {
        Name     string `json:"username"`
        Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {
        Name  string `json:"username,omitempty"`
        Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {
        Street string `json:"street"`
        City   string `json:"city"`
    }
    
    type User struct {
        Name    string  `json:"username"`
        Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package main

import (
    "encoding/json"
    "fmt"
)

type User struct {
    Name     string `json:"username"`
    Age      int    `json:"age,omitempty"`
    Password string `json:"-"`
}

func main() {
    user := User{
        Name:     "Alice",
        Age:      0,  // 这里是零值
        Password: "secret",
    }

    // 将结构体转换为 JSON
    jsonData, _ := json.Marshal(user)
    fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。
posted @ 2024-12-25 13:25  牛马chen  阅读(9)  评论(0编辑  收藏  举报